Rails3 - проверка уникальной пары индексов - PullRequest
1 голос
/ 04 ноября 2010

Я создал индекс в своих миграциях:

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 ]

3 голосов
/ 04 ноября 2010
class Enrollment < ActiveRecord::Base    
  validates_uniqueness_of :student_id, :scope => :lecture_id
end

Если вы хотите до представления новой регистрации определить, что эта пара существует, вы можете использовать ajax-запрос (я предпочитаю RJS с JQuery) и проверить его с помощью:

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

Hopeэто поможет вам.

1 голос
/ 27 октября 2011

Извините за открытие старого потока, но так как это 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. Я не пробовал, но это должно работать для более чем 2 полей.

Надеюсь, я ничего не напутал, и это кому-нибудь поможет. :)

0 голосов
/ 04 ноября 2010

Попробуйте!

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."

То, как волды определить в ответе, это правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...