【问题标题】:Rails eager loading associationsRails 急切加载关联
【发布时间】:2017-01-23 11:23:02
【问题描述】:

我有两个型号MSellingStaffMPosition

#m_selling_staff.rb

class MSellingStaff < ActiveRecord::Base
  belongs_to :m_position
end

#m_position.rb

class MPosition < ActiveRecord::Base
  self.primary_key ='pos_id'
  has_many :m_selling_staffs, :foreign_key => 'emp_pos_id'
end

我在m_position 中有一个属性pos_short_name。当我尝试时

@sellers = MSellingStaff.includes(:m_position).all
@sellers.first.pos_short_name

我来了

#MSellingStaff:0x0000000651a5d0 的未定义方法“pos_short_name”

当我尝试时

@sellers.first.m_position.pos_short_name

我得到了

nil:NilClass 的未定义方法 `pos_short_name'

在 Rails 控制台中,我可以看到为

生成的 SQL
@sellers = MSellingStaff.includes(:m_position).all

MSellingStaff 负载 (0.6ms) SELECT "m_ sell_staffs".* FROM "m_sales_staffs" MPosition 负载 (0.2ms) SELECT "m_position".* FROM "m_position" WHERE "m_position"."pos_id" IN ('')

我做错了什么?提前致谢

【问题讨论】:

  • "undefined method `pos_short_name' for nil:NilClass" 表示 @sellers.first.m_position 为 nil -- 换句话说,您有没有关联 MPosition 的 MSellingStaff 实例
  • @DavidAldridge 这很奇怪,m_selling_staffsemp_pos_id 列中的所有值都存在于m_positionpos_id 列中
  • 你应该在m_selling_staffs 表中有pos_id,它应该根据你的关系引用m_position

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord


【解决方案1】:

尝试将foreign_keyclass_name 添加到MSellingStaff 模型。

class MSellingStaff < ActiveRecord::Base
  belongs_to :m_position, :foreign_key => 'emp_pos_id', :class_name => "MPosition" 
end



class MPosition < ActiveRecord::Base
  self.primary_key ='pos_id'
  has_many :m_selling_staffs, :foreign_key => 'emp_pos_id'
end

【讨论】:

    【解决方案2】:

    使用下面的

    @sellers.first.m_position.pos_short_name
    

    这是因为 pos_short_name 在 m_position 模型中

    【讨论】:

    • 表示@sellers.first.m_position 不存在
    【解决方案3】:

    你应该搬家 :foreign_key =&gt; 'emp_pos_id' tobelongs_to 关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多