Как получить доступ к связанным атрибутам таблицы при проверке перед их сохранением в Ruby on Rails - PullRequest
1 голос
/ 31 мая 2011

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

Цель такой имплантации состоит в том, что, если кто-то хочет сохранить черновик записи формы, по какой-либо причине проведение его проверки может остановить их сохранение, что не является желательным поведением, и нужно толькопроверить записи, которые становятся общедоступными, установив статус в true.

Пример ниже

атрибут атрибута status находится в Article

model Article
  has_many :sub_articles
  accepts_nested_attributes_for :sub_articles, :allow_destroy => true

  validate_presence_of :body, :unless => Proc.new{|article| !article.status }

model SubArticle
  belongs_to :article
  has_many :foos
  accepts_nested_attributes_for :foos, :allow_destroy => true    

  validate_presence_of :body, :unless => Proc.new{|sub_article| !sub_article.article.status }

model Foo
  belongs_to :sub_article

  validate_presence_of :body, :unless => Proc.new{|foo| !foo.sub_article.article.status }

проверка пропуска для Article будет работать, но не будетдля SubArticle или Foo, поскольку они не были сохранены и там не установлены идентификаторы, что не позволяет им проходить по ассоциациям, как в примере.

Можно ли получить доступ к связанным атрибутам таблицы в точке проверки?

Любая помощь будет принята с благодарностью.

------ Обновлено -----

Причина, по которой валидация для SubArticle и Foo завершилась неудачей, заключается в том, что

неопределенный метод `status 'для nil: NilClass

Это ожидаетсяиз-за времени проверки article_id или sub_article_id все еще ноль, я подтвердил это, выполнив

model SubArticle
  belongs_to :article
  has_many :foos

  validate_presence_of :body, :unless => Proc.new{|sub_article| !sub_article.article.check_attributes }

def check_attributes
  pp self
end

, ведьма дает

#<SubArticle id: nil, body: "", article_id: nil, created_at: nil, updated_at: nil >

----- обновлено 2----------

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

Ответы [ 3 ]

0 голосов
/ 31 мая 2011

Как насчет условной проверки идентификатора?

model Article
  has_many :sub_articles

  validate_presence_of :body, :unless => Proc.new{|article| !article.status }

    model SubArticle
      belongs_to :article
      has_many :foos

      validate_presence_of :body, :unless => Proc.new{|sub_article| !sub_article.article_id}

model Foo
  belongs_to :sub_article

  validate_presence_of :body, :unless => Proc.new{|foo| !foo.sub_article_id }

Не уверен, что это сработает, но вы, по сути, выполняете проверку, только если родительская модель сохранила и, следовательно, имеет идентификатор. Не будет работать на обновления, хотя. Возможно, сочетание между этим и вашим исходным кодом подойдет для обновления?

0 голосов
/ 01 июня 2011

У меня все получилось, хотя хакерство решило проблему невозможности прохождения ассоциаций, так как идентификаторы равны нулю, используя: inverse_of

model Article
  has_many :sub_articles, :inverse_of => :article

  validate_presence_of :body, :unless => Proc.new{|article| !article.status }

model SubArticle
  belongs_to :article, :inverse_of => :sub_articles
  has_many :foos, :inverse_of => :foo

  validate_presence_of :body, :unless => Proc.new{|sub_article| !sub_article.article.status }

model Foo
  belongs_to :sub_article, :inverse_of => :foos

  validate_presence_of :body, :unless => Proc.new{|foo| !foo.sub_article.article.status }

, что сделает экземпляр проверяемым во всех слояхиметь доступ к атрибуту статуса.

0 голосов
/ 31 мая 2011

Возможно, но вам нужно использовать => вместо =. Как это:

validate_presence_of :body, :unless => Proc.new{|article| !article.status }

Пожалуйста, смотрите: http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation для получения дополнительной информации об условных проверках.

...