【问题标题】:belongs_to association conflicts when instantiating, "Validation failed... must exist" error实例化时的belongs_to关联冲突,“验证失败...必须存在”错误
【发布时间】:2016-03-16 01:22:05
【问题描述】:

这就是我做关联的方式:

class Event < ApplicationRecord
  has_one :lineup
  has_many :artists, :through => :lineup
  belongs_to :venue
end

class Lineup < ApplicationRecord
  belongs_to :artist
  belongs_to :event
end

这就是我尝试播种的方式

Event.create!(name: "The Function", 
              date: DateTime.new(2016,2,3,10,0,0,'+7'), 
              venue: Venue.create!(name: "Speakeasy", address: "Lynwood Ave", zip_code: "30312"), 
              lineup: Lineup.create!(:artist => Artist.create!(name: "DJ Sliink", bio: "jersey club king")), 
              description: "free free free")

我得到的错误是ActiveRecord::RecordInvalid: Validation failed: Event must exist,它指向lineup 行。如果我设置lineup: nil,我会收到相同的消息,然后在创建Event 后,尝试执行event1.lineup = Lineup.create!...。我有什么选择可以摆脱 Lineup 对现有 Event 的依赖?据我了解,问题出在belongs_to 关系上,因为如果我从 Lineup 实例创建中取出artist:,我也会得到Artist must exist 错误。

验证:

> Event.validators
 => [#<ActiveRecord::Validations::PresenceValidator:0x007fcaab69fa78 @attributes=[:venue], @options={:message=>:required}>]

> Lineup.validators
 => [#<ActiveRecord::Validations::PresenceValidator:0x007fcaad988238 @attributes=[:artist], @options={:message=>:required}>, #<ActiveRecord::Validations::PresenceValidator:0x007fcaab77c7c0 @attributes=[:event], @options={:message=>:required}>]

如果没有种子文件中的!s,我会得到一个完全不同的错误-ActiveRecord::AssociationTypeMismatch: Venue(#70094220768860) expected, got Fixnum(#70094214808600),尽管仍然是event = Event.create 行。

【问题讨论】:

  • 请在您的帖子中添加验证。
  • 我没有写任何验证。它们是自动生成的吗?

标签: ruby-on-rails associations belongs-to


【解决方案1】:

在 Rails 5 中,belong_to 默认充当validates_presence_of,因此为了允许不存在的关系,请将optional: true 选项添加到belongs_to。例如:

belongs_to :parent,
           optional: true

【讨论】:

  • 你为我节省了大量时间!当您在父模型上使用 accept_nested_attributes_for 时非常有用。
【解决方案2】:

您为什么要尝试将整个对象保存在另一个对象上?为什么不只是id?

venue = Venue.create!(name: "Speakeasy", address: "Lynwood Ave", zip_code: "30312")
artist = Artist.create!(name: "DJ Sliink", bio: "jersey club king")
lineup = Lineup.create!(:artist_id => artist.id) 

event = Event.create!(name: "The Function", 
          date: DateTime.new(2016,2,3,10,0,0,'+7'), 
          venue_id: venue.id, 
          lineup_id: lineup.id,
          description: "free free free")

检查您的架构以确保场地和阵容是 ID...如果不是,您将它们保存为什么数据类型?如果它们是字符串,您可以保存名称。您不太可能打算将整个对象保存到事件中。没有意义。

【讨论】:

  • 一开始我也想这样做,但不知道.id 部分。 EventVenueLineup建立关系时,venue_idlineup_id属性不是自动生成的吗?
  • 没有。它们不是自动生成的。检查您的 db/schema 文件以确保您有场地 ID 和阵容 ID 作为属性。如果他们不在那里,您将需要运行迁移。简单地编写 has_manybelongs_to 不会改变数据库的组成。
  • 我明白了。我仍然收到Event must exist 错误。我应该在架构或任何地方寻找什么?
  • 好的,所以问题一定出在event_id参数上。但是,它需要它,不是吗?一个阵容只能属于一个赛事。还是事件实例中一个阵容的key就足够了?
  • 将您的架构发布在一个要点中:gist.github.com 并发布链接,我会看看。
猜你喜欢
  • 2019-01-24
  • 2016-12-23
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多