#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. Согласен с комментарием Джима здесь… Просто используйте проверки в модели статьи.