由于未设置关联的其他方,Rails验证失败

时间:2014-03-19 14:29:58

标签: ruby-on-rails ruby activerecord

问题

class Match
  has_many :items
end

class Item
  belongs_to :match
  validates :match, presence: true
end

class ItemBuilder
  def self.build
    5.times.map { |_| Item.new }
  end
end

class MatchBuilder
  def self.build
    Match.new(items: ItemBuilder.build)
  end
end

match = MatchBuilder.build
match.save # Validation fails because Item#match isn't set!

在我看来,rails在分配Item#match时应该设置Match#items关联,但事实并非如此。

实际上,ItemBuilder根据API中的信息构建项目。我不希望知道这些项目的放置位置,因此我无法将匹配传递到ItemBuilder

我也不希望Matchbuilder知道从ItemBuilder返回的项目的内部,所以我无法做到

class MatchBuilder
  def self.build
    items = ItemBuilder.build
    match = Match.new(items: items)
    items.each do |item|
      item.match = match
    end
  end
end

有没有办法解决这个问题,而没有明确设置Item#match

可能的解决方案

  • 删除验证,并让数据库执行非空验证
  • 在before_validation过滤器中分配Item#match

1 个答案:

答案 0 :(得分:2)

我会做这样的事情:

match = Match.new
5.times { match.items.build }
match.save

在这种情况下,不确定项目关联是否需要autosave: true