多个 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 完全符合正确的关系。

我错过了什么? 非常感谢您的帮助。

example from my console where owner_id: nil even when its created from a @car who has already owner_id

如果我的理解是正确的,你的问题是在你的关系中没有任何地方强制 Car 中的 owner_id 和 Visit 中的 owner_id 应该相同。您的模型将支持属于一个所有者的汽车,但附加到属于其他人的访问;因此,当您创建访问时,rails 会将 owner_id 保留为 nil,因为它不知道应该属于哪个所有者。

三个简单的解决方案:

  1. 完全可以去掉Owner和Visit的关系,只创建自己需要的方法,调用Car对应的方法:

    class Visit < ActiveRecord::Base
      belongs_to :car
    
      def owner_id
        car.owner_id
      end
    
      def owner
        car.owner
      end
    end
    
  2. 在创建语句中明确指定所有者:car1.visits.create(owner: car1.owner, .....)

  3. 在回调中将 owner_id 设置为正确的值:

    class Visit < ActiveRecord::Base
      belongs_to :car
      belongs_to :owner
    
      before_create do
        self.owner_id = car.owner_id
      end
    end