2014-02-17 106 views
0

我有兩個AR模型:導軌 - belongs_to的忽略inverse_of

class User < ActiveRecord::Base 
    set_primary_key 'email' 
    attr_readonly :email, :etag, :full_name, :google_id, :photo_url, :suspended 
    has_one :sip_user, inverse_of: :user, foreign_key: 'user_email' 
end 

class SipUser < ActiveRecord::Base 
    set_primary_key 'user_email' 
    attr_readonly :user_email, :sip_id, :sip_password, 
       :int_number, :ext_number, :mobile_number 
    belongs_to :user, inverse_of: :sip_user, foreign_key: 'email' 
end 

從用戶到SipUser查詢完美的作品:

User.find('[email protected]').sip_user 

返回正確的匹配SIP用戶。

SipUser.find('[email protected]') 

也返回正確的DB項,但

SipUser.find('[email protected]').user 

沒有。但根據belongs_to:user,inverse_of::sip_user,它應該是。

任何想法?

回答

0

inverse_ofSipUser.find('[email protected]').user表達式無關。您在SipUser中的指定意味着:對於此sip_user,找到具有user.email= sip_user.email的用戶。這導致此查詢SELECT * FROM USERS WHERE email='[email protected]' LIMIT 1; 您的inverse_of將有助於此案例sip_user.user.sip_user。如果您沒有inverse_of,它將使用兩個查詢,第一個查找sip_user的用戶,第二個查找sip_user.user的sip_user。使用inverse_of時,它只會發送第一個查詢並立即以sip_user.user.sip_user的形式返回sip_user。所以它有助於您的數據庫效率。