Rails:只有连接表的多对多展平

时间:2011-11-01 18:20:25

标签: ruby-on-rails ruby-on-rails-3.1

我有一个模型对象,它链接到多对多关系中的国家/地区列表。这些国家/地区的关键字为ISO 3166 alpha-2 codes

我想要完成的事情是保存使用Country类和表,并且只有我的对象具有object.countries形式的访问器,它将返回一个字符串数组,例如: ["IL", "US", "IT", ... ]

基本上,只有连接表的has_and_belongs_to_many动作。 这可能吗?

对于国家/地区列表,是否有最佳做法?

1 个答案:

答案 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

当然,我很高兴听到任何建议。