【问题标题】:Multiple t.references get nil value for the second nested models多个 t.references 获得第二个嵌套模型的 nil 值
【发布时间】:2016-03-31 22:46:28
【问题描述】:

我通过两个 t.references 访问 who belongs_to owner 和 belongs_to car,当我通过 @car.visits.create 创建新访问时,owner_id 一直为零。

访问.rb

class Visit < ActiveRecord::Base
#validates :notes, presence:true
belongs_to :car
belongs_to :owner
end

所有者.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

访问迁移

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2 ruby-on-rails-3.1


    【解决方案1】:

    如果我的理解是正确的,那么您的问题是,在您的关系中,您没有强制要求 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
      

    【讨论】:

    • 太好了,我使用了解决方案 3。也使用了 before_save,所以当我编辑 car_id 时,owner_id 也发生了变化,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多