无法通过关系直接验证has_many的孩子

时间:2014-03-16 21:32:01

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我有以下设置:

class Round < ActiveRecord::Base
  has_many :cards_rounds
  has_many :cards, through: :cards_rounds
  accepts_nested_attributes_for :cards_rounds

  validate :round_validations

  private

  def round_validations
    // pry
    unless cards.map(&:id).uniq.size == 3
      errors.add(:round, "Must have 3 unique cards")
    end
    unless cards.map(&:quality).uniq.size == 1
      errors.add(:round, "Cards must be of the same rarity")
    end
  end
end

class CardsRound < ActiveRecord::Base
  belongs_to :card
  belongs_to :round
end

class Card < ActiveRecord::Base
  has_many :cards_rounds
  has_many :rounds, through: :cards_rounds
end

Round始终无法在创建时进行验证。当我介入使用pry时,我可以看到cards为零,但cards_rounds已填充,我可以调用cards_rounds[0].card(例如)。

这是预期的行为吗?我觉得很奇怪,我可以通过cards_rounds引用这些卡片,但不能直接作为一个集合。

Rails版本是4.0.1

2 个答案:

答案 0 :(得分:0)

是的,我感觉到你的痛苦。我不确定这是否是预期的行为,但我有时会遇到同样的问题。

最好的想法是你可以在https://github.com/rails/rails

上打开一个问题

答案 1 :(得分:0)

不确定问题出在哪里,我做了以下测试通过的要点:https://gist.github.com/arthurnn/9607180。看到我改变了验证。问题是验证不能依赖于从卡上映射ID,因为它们还没有id。