代码之家  ›  专栏  ›  技术社区  ›  Chowlett

RubyonRails:验证子对象的唯一性(或数量)

  •  1
  • Chowlett  · 技术社区  · 14 年前

    我有一个模型, Game 哪一个 has_many :piles . 事实上,我知道每一个游戏都有4堆,每一堆都有不同的(在游戏范围内) contents . 我创建游戏的web表单允许用户选择四个内容(C_类型)。因此,我可以在创建游戏时填充成堆的内容。然而,我不知道如何确保我有4个独特的桩。我的模型如下:

    class Game < ActiveRecord::Base
      has_many :piles
    
      def after_create
        1.upto(4) do |num|
          piles.create("contents" => "c_type_#{num}")
        end
      end
    end
    
    class Pile < ActiveRecord::Base
      belongs_to :game
      validates_uniqueness_of :contents, :scope => "game_id"
    end
    

    …我添加堆的迁移过程如下:

    class CreatePiles < ActiveRecord::Migration
      def self.up
        create_table :piles do |t|
          t.integer :game_id
          t.string :contents
        end
    
        add_index :piles, [:game_id, :contents], :unique => true
      end
    
      def self.down
        drop_table :piles
      end
    end
    

    …但所有这一切意味着,非唯一的堆不会被悄悄地添加到数据库中;而父游戏的结果是少于4堆。

    我现在通过玩游戏来解决这个问题 validate :unique_pile_contents, :on => :create 在哪里 unique_pile_contents 验证C_u类型_u35;值的uniq'd数组的长度是否为4-但这感觉非常笨拙。有更好的方法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community Egal    7 年前

    作为我正在解决的另一个问题的一部分,我已经设法解决了这个问题。见 Creating a set number of child objects from a parent's form 答案(以及问题中稍微简单一点的例子)。