2010-11-20 62 views
3

我想使水木清華這樣的:Rails的先進協會

class MyModel < ActiveRecord::Base 
    has_many :locations 
    has_one :location, :class_name => 'Location', :join => "RIGHT JOIN locations ON locations.user_id=mymodels.user_id" 
end 

所以爲MyModel只能爲每個用戶一個位置,儘管它有很多的位置。 我該如何定義?謝謝!

回答

4

命名協會如您有關聯的兩個複數,模型名稱的單數形式可能會造成混淆,也可能導致方法重疊。除了最佳做法外,您通常不需要提供原始SQL。你的情況也不例外。

它看起來像MyModel也屬於用戶。和用戶似乎有一個與位置的許多關係,那麼你可以做這樣的事情:

基於SQL Assumeing以下型號發佈時間:

class User < ActiveRecord::Base 
    has_many :my_models 
    has_many :locations 
end 

class Location <ActiveRecord::Base 
    belongs_to :my_model 
    belongs_to :user 
end 



class MyModel < ActiveRecord::Base 
    has_many :locations 
    belongs_to :user 
    has_one :user_location, through => :user, :source => :location 
end 

但是,你不知道哪個位置如果用戶有很多位置,你會得到。但是如果至少有一個,你就保證有一個。

2

我可能是錯的...

class MyModel < ActiveRecord::Base 
    has_many :location 
    belongs_to :user 
end 

class Location< ActiveRecord::Base 
    belong_to :my_model 
end 

class User< ActiveRecord::Base 
    has_one :my_model 
end 

的你可以用MyModel.first.user.location獲取用戶位置

+1

你有has_many關聯,所以你應該能夠將它定義爲某種連接。另外想象一下100個結果的列表,並且您只希望對數據庫有1個請求。 – xpepermint 2010-11-20 13:17:58