6

Używam Rails 3.1.0 i chciałbym "dotknąć" modelu nadrzędnego skojarzenia belongs_to tylko wtedy, gdy spełnione są określone warunki.Jak "dotknąć" modelu macierzystego skojarzenia `belongs_to` tylko wtedy, gdy spełnione są określone warunki?

Na przykład, w tej chwili mam:

belongs_to :article, 
    :touch => true 

bym „dotknąć” modelu nadrzędnego tylko jeżeli jest to „publiczna”. Oznacza to, że klasa Article ma atrybut o nazwie access (@article.access =>public lub private) i chciałbym sprawdzić tę wartość przed „dotknięcia”: jeżeli wartość ta jest niepublic, a następnie „dotknąć” to!

Czy można to zrobić "bezpośrednio" w oświadczeniu o stowarzyszeniu belongs_to? Jeśli tak to jak?

Odpowiedz

4

Można spróbować lambda, jak pan powiedział, ale Nie jestem pewien, czy to zadziała. Coś takiego:

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

Według implementation może można spróbować wrócić nil zamiast false w proc, gdy nie jest dostępny

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

Jeśli to nie działa użyć przed zapisaniem w takim razie:

class Model < ActiveRecord::Base 
    belongs_to :article 

    before_save :touch_public_parent 

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

Daj mi znać, jeśli masz jakieś pytania.

Aktualizacja # 1

Istotna część z add_touch_callbacks:

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

Więc jeśli przechodzą prawdziwe, to robi to proste dotknięcie atrybutu updated_at. Jeśli prześlesz nazwę pola, zaktualizujesz to pole, chyba że przekażemy nil. Jeśli minisz zero, nic nie zaktualizuje. Dlatego powiedziałem, że może wypróbujesz drugą wersję skojarzenia belongs_to.

+0

Nie ma dokumentacji związanej z metodą "add_touch_callbacks", którą podałeś w odpowiedzi ... czy możesz powiedzieć coś więcej na ten temat (np. Jak to działa)? – Backo

+0

@Backo Oczywiście, zobacz moją zaktualizowaną odpowiedź. – dombesz

+0

Dziękuję bardzo. Do zobaczenia następne pytanie/odpowiedź! – Backo

0

Nie sądzę, aby można zastosować dotyku z warunkiem w stowarzyszeniu belongs_to.

Jest droga, która jest nieco hacky, ale będzie działać bezpośrednio z asocjacji belongs_to,

To nie może być zalecany sposób

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

Czy można użyć wartości 'Proc' /' lambda' w wartości opcji ': touch'? – Backo

+0

no, nie możesz użyć proc lub lambda, cytując z dokumentacji, ": touch => Jeśli true, powiązany obiekt zostanie dotknięty (atrybuty updated_at/on ustawione na teraz), gdy ten zapis jest zapisany lub zniszczony. Jeśli określisz symbol, ten atrybut zostanie zaktualizowany o bieżący czas oprócz atrybutu updated_at/on. " –

+0

Właśnie otworzyłem kolejne pytanie, aby znaleźć inne rozwiązanie: http://stackoverflow.com/questions/8872045/there-is-a-way-to -handle-after-save-and-after-destroy-equally. – Backo

Powiązane problemy