accept_nested_attributes_ для проверки - PullRequest
4 голосов
/ 25 октября 2010

Я использую 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.

1 Ответ

4 голосов
/ 15 сентября 2012

вместо

validates_uniqueness_of :code, :scope => :parent_id

Попробуйте

validates_uniqueness_of :code, :scope => :parent

Кроме того, вам нужно установить в классе Category:

has_many :children, :inverse_of => :category # or whatever name the relation is called in Child

Использование inverse_of установит переменную потомков parent перед сохранением, и есть вероятность, что она будет работать.

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