【问题标题】:Rails model validation of has_many relationship counthas_many 关系计数的 Rails 模型验证
【发布时间】:2023-03-18 23:45:02
【问题描述】:

在我的 Rails 应用程序中,我有 Card 和 Pack 模型,以及它们之间的多对多关系。我想验证一个包是用 3 张卡片创建的。该包使用复选框实现与卡片相关联。

我的问题:运行验证时,似乎没有进行任何关联。验证失败,打印输出为“卡片数为:0”。为什么在验证运行时没有关联? (注意:删除验证后关联是正确的,因此代码有效,只是验证无效)

# Pack Model
class Pack < ActiveRecord::Base
  has_many :pack_elements
  has_many :cards, :through => :pack_elements
  validate :validate_number_of_cards

  def validate_number_of_cards
    puts "cards count is: " + cards.count
    errors.add(:cards, "A pack must contain exactly 3 cards.") if (cards.count != 3)
  end
end

其他模型与您期望的一样,但没有验证。这是 Packs 表单,它显示了所有卡片,每个卡片旁边都有一个复选框,还有一个提交按钮。我想测试其中三个框是否被选中,并且我希望测试在模型中,而不是在表单中。

# packs/_form.html.erb
<%= form_for(@pack) do |f| %>

<div class="field">
  <% @cards.each do |card| %>
      <%= hidden_field_tag "pack[card_ids][]", nil %>
      <%= check_box_tag "pack[card_ids][]", card.id, @pack.card_ids.include?(card.id), id: dom_id(card) %>
      <%= label_tag dom_id(card), card.description %>
      <hr/>
  <% end %>
</div>

<div class="actions">
  <%= f.submit %>
</div>

【问题讨论】:

  • 这个问题你解决了吗?因为我有类似的,但找不到答案。
  • @MarcinDoliwa 我确实解决了,请参阅下面的答案。

标签: ruby-on-rails validation activerecord has-many-through


【解决方案1】:

上述实现中的问题是我使用了 count 方法,该方法进行数据库查找。在验证通过之前不会保存数据库,因此这永远不会起作用。我将实现更改为:

def validate_number_of_cards
  puts "Count shows there are " + cards.count + " cards."  # always returns zero
  puts "Size shows there are " + cards.size + " cards."
  errors.add(:cards, "A pack must contain exactly 3 cards.") if (cards.size != 3)
end

它使用 size 方法,它只查看内存中的内容。效果很好。

【讨论】:

    【解决方案2】:

    验证在包装模型中。因此在保存 Pack Model 时会触发验证。

    您需要在 Card 模型的保存中处理此验证。

    【讨论】:

    • 我如何验证卡片模型中的卡片包中有多少张卡片?我看不出有什么办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多