【问题标题】:Rails - belongs_to ignores inverse_ofRails - belongs_to 忽略 inverse_of
【发布时间】:2014-02-17 15:23:57
【问题描述】:

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

从 User 到 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。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多