我有一个模型对象,它链接到多对多关系中的国家/地区列表。这些国家/地区的关键字为ISO 3166 alpha-2 codes。
我想要完成的事情是保存使用Country类和表,并且只有我的对象具有object.countries
形式的访问器,它将返回一个字符串数组,例如: ["IL", "US", "IT", ... ]
。
基本上,只有连接表的has_and_belongs_to_many
动作。
这可能吗?
对于国家/地区列表,是否有最佳做法?
答案 0 :(得分:0)
这就是我最终解决的问题,我在数据库中创建了一个国家/地区表,因为我更喜欢HABTM关系。
但是为了简化问题,我覆盖了集合上的<<
运算符,因此我可以将国家/地区代码作为字符串或字符串数组推送(object.country << 'IL'
):
has_and_belongs_to_many(:countries) do
def <<(country)
if [*country].all? {|c| c.is_a?(String) }
countries = Country.where(:code => country)
concat(*countries)
else
concat(country)
end
end
end
您可能会发现来自here的[*...]
伎俩
传递concat(*countries)
也会使Rails在一个事务中插入所有行,这是一个很好的奖励。
并添加了一个函数,用于将简化的代码哈希值返回给国家/地区:
def countries_hash
return self.countries.map {|c| { c.code => c.name }}.inject({}) {|hash, elem| hash.merge!(elem)}
end
当然,我很高兴听到任何建议。