Я использую Rails 2.3.8 и acceptpts_nested_attributes_for.
У меня есть простой объект категории, который использует awesome_nested_set, чтобы разрешить вложенные категории.
Для каждой категории я хотел бы уникальное поле с именемкод.Это будет уникальным для категории на уровне.Значение родительских категорий будет иметь уникальные коды, а подкатегории будут уникальными в пределах их собственной родительской категории.
EG:
code name
1 cat1
1 sub cat 1
2 cat2
1 sub cat 1
2 sub cat 2
3 cat3
1 sub1
Это работает без процесса проверки, но когда я пытаюсь что-то использоватьнапример: validates_uniqueness_of: code,: scope =>: parent_id
Это не будет работать, потому что родительский объект еще не сохранен.
Вот моя модель:
class Category < ActiveRecord::Base
acts_as_nested_set
accepts_nested_attributes_for :children, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
default_scope :order => "lft"
validates_presence_of :code, :name, :is_child
validates_uniqueness_of :code, :scope => :parent_id
end
Я думал о другом способе сделать это, и он очень близок к работе, проблема в том, что я не могу проверить уникальность между дочерними категориями.
В этом втором примере я встроил скрытое поле в форме с именем is_child, чтобы указать, является ли элемент подкатегорией или нет.Вот мой пример этой модели:
class Category < ActiveRecord::Base
acts_as_nested_set
accepts_nested_attributes_for :children, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
default_scope :order => "lft"
validates_presence_of :code, :name, :is_child
#validates_uniqueness_of :code, :scope => :parent_id
validate :has_unique_code
attr_accessor :is_child
private
def has_unique_code
if self.is_child == "1"
# Check here if the code has already been taken this will only work for
# updating existing children.
else
# Check code relating to other parents
result = Category.find_by_code(self.code, :conditions => { :parent_id => nil})
if result.nil?
true
else
errors.add("code", "Duplicate found")
false
end
end
end
end
Это очень близко.Если бы был способ обнаружить дубликаты кодов в синтаксисе reject_if в acceptpts_nested_attributes_for, то я был бы там.Это все кажется слишком сложным, и хотелось бы предложения, чтобы сделать это проще.Мы хотели бы продолжать добавлять категории и подкатегории в одну форму, поскольку это ускоряет ввод данных.
Обновление: Возможно, мне следует использовать build или before_save.