заказ коллекции has_many для проверки перед сохранением в базу данных - PullRequest
0 голосов
/ 01 сентября 2011

Моим моделям необходимо постоянно устанавливать определенный порядок ассоциации has_many, даже до добавления новых строк в базу данных.

Предположим, у меня есть ассоциация has_many / assign_to следующим образом:

    class Assembly < ActiveRecord::Base
      has_many :parts, :order => "part_number ASC"
    end

    class Part < ActiveRecord::Base
      belongs_to :assembly
    end

Насколько я понимаю, флаг :order в ассоциации has_many упорядочит записи, поступающие из базы данных, добавив в запрос SQL предложение ORDER BY. Однако в моем случае также важно, чтобы коллекция деталей в Assembly была заказана для проверки правильности, и это должно произойти даже до того, как записи будут записаны в базу данных.

Я немного поэкспериментировал с этим в консоли rails, выполнив следующее:

a = Assembly.new
p1 = Part.new( :part_number => 2 )
p2 = Part.new( :part_number => 1 )

a << p1    #p1 is added first but should be in second place in collection
a << p2    #p2 is added second but should be in first place in collection

a.parts[0]    #expecting to see part_number=1 but I still get part_number=2

Следовательно, подпрограмма проверки для нового объекта сборки не будет работать. Может ли кто-нибудь порекомендовать лучший способ обеспечения порядка в коллекции has_many перед записью в базу данных?

1 Ответ

0 голосов
/ 01 сентября 2011

Вы должны применять его на Part модели

class Part
  validates_each :part_number, :on => :create do |record, attr, value|
    # if there is already a part number higher than the current part number
    if record.assembly.parts.exists?(
         :conditions => ["part_number >= ?", record.part_number])
      record.errors.add attr, 'missing part number sequence.' 
    end
  end
end
...