Как «дотронуться» до родительской модели ассоциации `own_to`, только если выполнены определенные условия? - PullRequest
6 голосов
/ 15 января 2012

Я использую Rails 3.1.0, и я хотел бы "трогать" родительскую модель ассоциации belongs_to, только если выполняются определенные условия.

Например, в настоящее время у меня есть:

belongs_to :article,
  :touch => true

Я бы «трогал» родительскую модель, только если она «общедоступна».То есть класс Article имеет атрибут с именем access (@article.access => public или private), и я хотел бы проверить это значение перед «касанием»: если это значение , не public, затем «дотроньтесь» до него!

Возможно ли сделать это «непосредственно» в операторе ассоциации belongs_to?Если да, то как?

Ответы [ 2 ]

4 голосов
/ 15 января 2012

Вы можете попробовать лямбду, как вы сказали, но я не уверен, сработает ли она. Примерно так:

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public }

В соответствии с реализацией может быть, вы можете попытаться вернуть nil вместо false в процедуре, когда она недоступна

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public ? true : nil }

Если это не работает, используйте обратный вызов перед сохранением, например:

class Model < ActiveRecord::Base
  belongs_to :article

  before_save :touch_public_parent

  def touch_public_parent
    article.touch if article && article.public?
  end
end

Дайте мне знать, если у вас есть какие-либо вопросы.

Обновление № 1

Соответствующая часть от add_touch_callbacks:

if touch_attribute == true
  association.touch unless association.nil?
else
  association.touch(touch_attribute) unless association.nil?
end

Так что если вы передадите true, тогда просто коснитесь атрибута updated_at. Если вы передадите имя поля, то обновите это поле, если вы не передадите nil. Если вы передадите nil, ничего не обновится. Вот почему я сказал, что, возможно, вы можете попробовать вторую версию belongs_to ассоциации.

0 голосов
/ 15 января 2012

Не думаю, что вы можете применить касание к условию в ассоциации принадлежащих вам.

Есть способ, который немного хакерский, но будет работать напрямую с ассоциацией принадлежащей,

Возможно, это не рекомендуемый способ

class YourModel
  belongs_to :article
  belongs_to :public_article, :class_name=> "Article", 
             :foreign_key => "article_id", 
             :conditions => {:public => true} , :touch => true 
end 
...