Rails - belongs_to忽略inverse_of

时间:2014-02-17 15:23:58

标签: ruby-on-rails-3 activerecord associations

我有两个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。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

inverse_ofSipUser.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返回。因此,它有助于提高数据库效率。