在Rails中,如何在加载子对象时自动加载父对象?

时间:2016-07-21 18:40:41

标签: ruby-on-rails-4 load associations parent belongs-to

我正在使用Rails 4.2.4。加载子对象时如何自动加载父对象?我有

class MyObject < ActiveRecord::Base
  belongs_to :address, class_name: 'Address', foreign_key: :address_id, :autosave => true, dependent: :destroy

但是当我打电话时

  @my_object = MyObject.find(params[:id])
  puts "address; #{@my_object.address} address_id: #{@my_object.address_id}"

输出

address;  address_id: 6792

意味着没有加载父对象,即使显然有一个绑定的地址记录。我想我的模型是自动加载的。我怎么能这样做?

编辑:为了回应wishalizer的建议,我将模型改为

class MyObject < ActiveRecord::Base
    …
  belongs_to :address, inverse_of: :my_object

class Address < ActiveRecord::Base
  has_one :my_object, inverse_of: :address

但仍然出现错误

NoMethodError (undefined method `includes' for #<MyObject:0x007fb7232415f8>):
  app/controllers/application_controller.rb:9:in `current_my_object'
  app/controllers/my_objects_controller.rb:5:in `edit'

在应用给出的建议时。

3 个答案:

答案 0 :(得分:0)

要在ActiveRecord中包含父关系,请在控制器中创建集合时使用.includes.includes对称为真,从父项到子项,或从子项到父项。

如果您明确调用.includes,那么您应该能够根据需要引用子集合中的父级。

@my_object = MyObject.find(params[:id]).includes(:address)

需要的模型关系 [新版]

追加/插入inverse_of到您的模型关系defs

    Class MyObject  
        belongs_to :address, {...your model rels..}, inverse_of: :my_object
        ...
    end

您还必须在相关模型中创建对称inverse_of

   Class Address
       has_many :my_objects, {...your model rels..}, inverse_of: :address
      ...
   end

答案 1 :(得分:0)

请查看。如果我出错,请更正我

MyObject.includes(:地址).references(:地址)

答案 2 :(得分:0)

  

但是当我打电话时

@my_object = MyObject.find(params[:id])
puts "address; #{@my_object.address} address_id: #>{@my_object.address_id}"
     

输出

address;  address_id: 6792

实际上,调用@my_object.address是加载地址记录。 @my_object.address显示为空白的一种可能情况可能是address id=6792并不存在。

要修正Val Asensio(wishalizer?)建议以修复NoMethodError,请将includes()函数移至正确的位置:

@my_object = MyObject.includes(:address).find(params[:id])