多个t.references为第二个嵌套模型获得nil值

时间:2016-03-31 22:46:29

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

我通过两个t.references访问了belongs_to所有者和belongs_to car,当我通过@ car.visits.create创建新访问时,owner_id一直保持为nil。

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

访问迁移

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

1 个答案:

答案 0 :(得分:0)

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

三个简单的解决方案:

  1. 您可以完全删除所有者和访问之间的关系,只需创建您需要的方法,这将从Car调用相应的方法:

    class Visit < ActiveRecord::Base
      belongs_to :car
    
      def owner_id
        car.owner_id
      end
    
      def owner
        car.owner
      end
    end
    
  2. 在您的create语句中明确指定所有者: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