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

Rails3-验证一对唯一的索引

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

    add_index "enrollments", ["student_id", "lecture_id"], :name => "index_enrollments_on_student_id_and_lecture_id", :unique => true

    如何在Rails中验证这对密钥?我试过:

    validates_uniqueness_of :enrollment_id, :scope => [:student_id, :lecture_id]
    

    但它不能正常工作。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Voldy    14 年前
    class Enrollment < ActiveRecord::Base    
      validates_uniqueness_of :student_id, :scope => :lecture_id
    end
    

    如果您想在提交新的注册之前确定该对是否存在,那么您可以使用Ajax请求(我更喜欢使用jQuery的RJS)并检查它:

    class Enrollment < ActiveRecord::Base    
      def self.pair_exists?(student_id, lecture_id)
        Enrollment.find_all_by_student_id_and_lecture_id(student_id, lecture_id).any?
      end
    end
    

        2
  •  1
  •   maddening    13 年前

    很抱歉打开了一个旧线程,但由于是2011年,我仍然找不到合适的验证器,所以我自己创建了一个:

    class UniqueSetValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        setup record
        record.errors[attribute] << "- collection of fields [" + @fields + "] is not unique" if record.class.count(:conditions => @conditions) > 0
      end
    
      def check_validity!
        raise ArgumentError, "Must contain an array of field names' symbols" unless options[:in] && options[:in].respond_to?(:each)
      end
    
      private
    
      def setup record
        conditions  = []
        fields      = []
    
        options[:in].each do |field|
          conditions  |= [ field.to_s + " = '" + record[field].to_s + "'" ]
          fields      |= [ field.to_s ]
        end
    
        @conditions = conditions.join(" AND ")
        @fields     = fields.join(", ")
      end
    end
    

    your_rails_app/lib/unique_set_validator.rb
    

    并在以下位置启用它:

    your_rails_app/config/application.rb
    

    通过添加此行:

    config.autoload_paths += %W( #{config.root}/lib  )
    

    validates :field, :unique_set => [ :field, :field2 ]
    

    它将验证对[:field,:field2]的唯一性,任何错误都将返回到:field。我还没试过,但它应该能在两个以上的领域发挥作用。

    我希望我没有弄糟任何事情,这会帮助别人。:)

        3
  •  0
  •   krunal shah    14 年前

    试试这个!

    validates_uniqueness_of :enrollment_id, student_id, :scope => [:student_id, :lecture_id], :lecture_id], :message => "combination of enrollment, student and lecture should be unique."
    

    更新:

    validates_uniqueness_of :student_id, :scope => [:lecture_id], :message => "combination of student and lecture should be unique."
    

    沃迪在回答中的定义是正确的。