我通过两个t.references访问了belongs_to所有者和belongs_to car,当我通过@ car.visits.create创建新访问时,owner_id一直保持为nil。
class Visit < ActiveRecord::Base
#validates :notes, presence:true
belongs_to :car
belongs_to :owner
end
class Owner < ActiveRecord::Base
has_many :cars
has_many :visits
accepts_nested_attributes_for :visits
accepts_nested_attributes_for :cars
end
class Car < ActiveRecord::Base
belongs_to :owner
has_many :visits
end
访问迁移
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完全充满了正确的关系。
我错过了什么? 非常感谢帮助。答案 0 :(得分:0)
如果我的理解是正确的,那么您的问题就是在您的关系中没有任何地方强制执行Car中的owner_id和访问中的owner_id应该是相同的。您的模型将支持属于一个所有者的汽车,但附属于属于其他人的访问;因此,当您创建访问时,rails会将owner_id保留为nil,因为它不知道应该属于哪个所有者。
三个简单的解决方案:
您可以完全删除所有者和访问之间的关系,只需创建您需要的方法,这将从Car调用相应的方法:
class Visit < ActiveRecord::Base
belongs_to :car
def owner_id
car.owner_id
end
def owner
car.owner
end
end
在您的create语句中明确指定所有者: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