accepts_nested_attributes_for :reject_if для запуска другого метода

У меня есть многоуровневая вложенная форма, использующая formtastic_cocoon (jquery-версия formtastic).

Я пытаюсь сделать некоторую проверку в смысле

if value is_numeric do
     insert into database
else do
     database lookup on text
     insert id as association
end

Я надеялся, что у accepts_nested_attributes_for будет опция :if, но, видимо, есть только :reject_if.

Есть ли способ создать проверку, как я описал как часть accepts_nested_attributes_for??

-----------------------Обновлено в соответствии с ответом Зубина ---------------------- -----

Я считаю, что Зубин находится на правильном пути с методом, но я не могу заставить его работать правильно. Я использую метод


    def lookup_prereq=(lookup_prereq)
        return if lookup_prereq.blank?
            case lookup_prereq
        when lookup_prereq.is_a?(Numeric) == true
            self.task_id = lookup_prereq
        else
            self.task = Task.find_by_title(lookup_prereq)
        end
    end

Когда я запускаю эту функцию, self.task_id помещается в базу данных как «0», а не как Task.id.

Мне интересно, не упускаю ли я что-то еще. Я не совсем уверен, что метод действительно вызывается. Разве я не должен сказать

lookup_prereq(attr[:prereq_id)

в какой-то момент?

-------------------дальнейшее редактирование ----------------------- думаю из чего смогу обнаружил, что метод вызывается только в том случае, если он имеет то же имя, что и значение для базы данных, поэтому я изменил метод на

def completed_task=(completed_task)

К сожалению, это по-прежнему приводит к 0 в качестве значения в базе данных.


person pedalpete    schedule 19.02.2011    source источник


Ответы (1)


Похоже, вам нужен метод в вашей вложенной модели, чтобы справиться с этим, например:

class Post < ActiveRecord::Base
  has_many :comments
  accepts_nested_attributes_for :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :author

  def lookup_author=(lookup_author)
    return if lookup_author.blank?
    case lookup_author
    when /^\d+$/
      self.author_id = lookup_author
    else
      self.author = Author.find_by_name(lookup_author)
    end
  end
end
person Zubin    schedule 19.02.2011
comment
Спасибо Зубин, я думаю, что это ОЧЕНЬ близко к тому, что я ищу, но, похоже, я не заставляю его работать правильно. Я обновил вопрос с помощью вашего кода, адаптированного для выполнения того, что я ищу, но по какой-то причине я не получаю поиск find_by_task, возвращающий правильный идентификатор, а база данных всегда получает 0. Вы заслуживаете баллы за получение правильного ответа, я думаю, но я не могу точно сказать, правильно ли работает метод. - person pedalpete; 21.02.2011