多个 t.references 为第二个嵌套模型获取 nil 值
Multiple t.references get nil value for the second nested models
我拜访了 belongs_to 车主,belongs_to 汽车经过两辆 t.references,当我通过 @[=36= 创建新拜访时,owner_id 一直为零].
Visit.rb
class Visit < ActiveRecord::Base
#validates :notes, presence:true
belongs_to :car
belongs_to :owner
end
Owner.rb
class Owner < ActiveRecord::Base
has_many :cars
has_many :visits
accepts_nested_attributes_for :visits
accepts_nested_attributes_for :cars
end
Car.rb
class Car < ActiveRecord::Base
belongs_to :owner
has_many :visits
end
Visit 迁移
class CreateVisits < ActiveRecord::Migration
def change
create_table :visits do |t|
t.boolean :open
t.text :notes
t.references :owner
t.references :car
t.timestamps null: false
end
end
end
如果我
car1 = Car.create(......)
car1.visits.create(.....)
我得到 Visit.owner_id = nil 的值,然而,car_id 完全符合正确的关系。
我错过了什么?
非常感谢您的帮助。
如果我的理解是正确的,你的问题是在你的关系中没有任何地方强制 Car 中的 owner_id 和 Visit 中的 owner_id 应该相同。您的模型将支持属于一个所有者的汽车,但附加到属于其他人的访问;因此,当您创建访问时,rails 会将 owner_id 保留为 nil,因为它不知道应该属于哪个所有者。
三个简单的解决方案:
完全可以去掉Owner和Visit的关系,只创建自己需要的方法,调用Car对应的方法:
class Visit < ActiveRecord::Base
belongs_to :car
def owner_id
car.owner_id
end
def owner
car.owner
end
end
在创建语句中明确指定所有者:car1.visits.create(owner: car1.owner, .....)
在回调中将 owner_id 设置为正确的值:
class Visit < ActiveRecord::Base
belongs_to :car
belongs_to :owner
before_create do
self.owner_id = car.owner_id
end
end
我拜访了 belongs_to 车主,belongs_to 汽车经过两辆 t.references,当我通过 @[=36= 创建新拜访时,owner_id 一直为零].
Visit.rb
class Visit < ActiveRecord::Base
#validates :notes, presence:true
belongs_to :car
belongs_to :owner
end
Owner.rb
class Owner < ActiveRecord::Base
has_many :cars
has_many :visits
accepts_nested_attributes_for :visits
accepts_nested_attributes_for :cars
end
Car.rb
class Car < ActiveRecord::Base
belongs_to :owner
has_many :visits
end
Visit 迁移
class CreateVisits < ActiveRecord::Migration
def change
create_table :visits do |t|
t.boolean :open
t.text :notes
t.references :owner
t.references :car
t.timestamps null: false
end
end
end
如果我
car1 = Car.create(......)
car1.visits.create(.....)
我得到 Visit.owner_id = nil 的值,然而,car_id 完全符合正确的关系。
我错过了什么? 非常感谢您的帮助。
如果我的理解是正确的,你的问题是在你的关系中没有任何地方强制 Car 中的 owner_id 和 Visit 中的 owner_id 应该相同。您的模型将支持属于一个所有者的汽车,但附加到属于其他人的访问;因此,当您创建访问时,rails 会将 owner_id 保留为 nil,因为它不知道应该属于哪个所有者。
三个简单的解决方案:
完全可以去掉Owner和Visit的关系,只创建自己需要的方法,调用Car对应的方法:
class Visit < ActiveRecord::Base belongs_to :car def owner_id car.owner_id end def owner car.owner end end
在创建语句中明确指定所有者:
car1.visits.create(owner: car1.owner, .....)
在回调中将 owner_id 设置为正确的值:
class Visit < ActiveRecord::Base belongs_to :car belongs_to :owner before_create do self.owner_id = car.owner_id end end