我有两个AR模型:
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@company.com').sip_user
返回正确匹配的SIP用户。
SipUser.find('email@company.com')
也会返回正确的数据库条目,但
SipUser.find('email@company.com').user
没有。但根据belongs_to:user,inverse_of :: sip_user。
有什么想法吗?
答案 0 :(得分:0)
inverse_of
与SipUser.find('email@company.com').user
表达无关。您在SipUser中的规范意味着:对于此sip_user,找到具有user.email= sip_user.email
的用户。这会导致此查询SELECT * FROM USERS WHERE email='email@company.com' LIMIT 1;
你的inverse_of对这个案例有用sip_user.user.sip_user
。如果你没有inverse_of,它将使用两个查询,第一个查找sip_user的用户,第二个查找sip_user.user的sip_user。使用inverse_of,它只会发送第一个查询并立即将sip_user作为sip_user.user.sip_user返回。因此,它有助于提高数据库效率。