我正在使用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'
在应用给出的建议时。
答案 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])