2011-11-01 59 views
1

我有一個模型對象,它以多對多關係鏈接到一個國家列表。這些國家的關鍵是他們的ISO 3166 alpha-2 codesRails:多對多扁平化只有連接表

我想要完成的事情是保存爲使用Country類和表,並且只允許我的對象有一個object.countries形式的存取器,它將返回一個字符串數組,例如:["IL", "US", "IT", ... ]

實質上,只有連接表的一種has_and_belongs_to_many動作。 這可能嗎?

在國家列表中是否有最佳做法?

+0

考慮一個標準的'has_many'並覆蓋'object'類中的'countries'方法 – apneadiving

回答

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插入一個事務中的所有行,這是一個不錯的獎勵。

,並添加了功能代碼的簡化哈希返回國家:

當然,我很高興聽到任何建議。