Как «принять» экземпляры вложенных объектов класса, запустив пользовательский метод перед их сохранением?

#ruby-on-rails #ruby #ruby-on-rails-3 #model #attributes

#ruby-on-rails #ruby #ruby-on-rails-3 #Модель #атрибуты

Вопрос:

Я использую Ruby on Rails 3.1.0, и я хотел бы запустить :reject_if метод (как описано в официальной документации, относящейся к accepts_nested_attributes_for методу в разделе «Один ко многим» ассоциации) для экземпляров объектов класса «вообще» (то есть для запуска :reject_if метода не для атрибутов — как сделанов связанной документации — но в записях, которые должны быть «впоследствии» сохранены в базе данных). В нескольких словах я хотел бы отклонить отфильтровать некоторые вложенные экземпляры объектов модели класса, которые должны храниться в базе данных, запустив пользовательский метод для этих экземпляров.

Например, если у меня есть следующее:

 class User < ActiveRecord::Base
  has_one :article,

  accepts_nested_attributes_for :article
end
  

Я хотел бы сделать что-то вроде этого (следующий код не работает):

 class User < ActiveRecord::Base
  has_one :article,

  # Note: by using 'article' in the block I (would like to) refer to class
  # object instances
  accepts_nested_attributes_for :article, :reject_if => { |article| article.can_be_created? }
end

class Article < ActiveRecord::Base
  def can_be_created?
    true if user.has_authorization?
  end
end
  

Возможно ли это? Если да, то как я могу это сделать?

Ответ №1:

Создайте метод, который возвращает логическое значение, и укажите имя метода в качестве символа :reject_if , например:

 accepts_nested_attributes_for :article, :reject_if => :article_uncreateable?

def article_uncreateable?
  !Article.new(article_attributes).can_be_created?
end
  

Комментарии:

1. Согласен с комментарием Джима здесь… Просто используйте проверки в модели статьи.