2013-12-19 89 views
2

假設一個「用戶」想要指定他們最喜歡的「城市」。建立這種關係的正確方法是什麼?Rails:用戶has_many CityPreferences模型關聯

選項1

協會:

User has_many :cities through :city_preferences. 
CityPreferences belongs_to :user and :city. 
City has_many :users through :city_prefences. 

表:

User 
email:string, first_name:string, last_name:string 

CityPreferences 
user:references, city:references 

City 
name:string 

選項2

協會:

User has_many :city_preferences 
CityPreferences belongs_to :user 

表:

User 
email:string, first_name:string, last_name:string 

CityPreferences 
user:references city:string 
+1

看看'has_many ... through' association:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association – vee

+0

謝謝@vinodadhikary剛更新的問題:) –

回答

2

您可以輕鬆地做到這一點與has_many :sm, through: :relation的幫助:

class User < ActiveRecord::Base 
    has_many :user_city_relations 
    has_many :preferred_cities, through: :user_city_relations, source: :city 

class City < ActiveRecord::Base 
    has_many :user_city_relations 
    has_many :users, through: :user_city_relations 

class UserCityRelation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :city 
    validates :user_id, :city_id, presence: true 

而且使用這樣的:

user.preferred_cities 

它與has_and_belongs_to_many非常相似,但在這裏您可以自己定義連接模型,從而可以更好地控制此關係。它也更加靈活(對於期貨中的新功能,如活躍/不活躍的首選城市等)

+0

有趣, 謝謝!爲什麼使用'class_name :: city'而不是隻調用'City'表'PreferredCity'? –

+0

您可能希望將城市模型用作常規城市,因爲它實際上代表城市對象。你可以像你說的那樣做,但如果後來你想使用這個模型,它的名字將是不相關的IMO ---我給你一個例子:在2個月內,你的經理要求你在你的應用程序中添加一個功能,用戶可以選擇他來自哪個城市。這將很容易添加:'belongs_to:living_city,class_name:'City'' – MrYoshiji

+0

你會爲UserCityRelation添加一列來表明這種關係是什麼? –

0

如果我理解你的問題,你不會要求如何實現選項1或2,但是選項1或選項2是首選。

這取決於您的應用程序以及是否希望每個城市都存在並作爲單獨的對象進行管理。