2012-01-15 12 views
6

Utilizzo Rails 3.1.0 e desidero "toccare" un modello principale di un'associazione belongs_to solo se sono soddisfatte determinate condizioni.Come "toccare" un modello principale di un'associazione `belongs_to` solo se sono soddisfatte determinate condizioni?

Per esempio, in questo momento ho:

belongs_to :article, 
    :touch => true 

vorrei "toccare" il modello di genitore solo se è "pubblica". Vale a dire, la classe Article ha un attributo denominato access (@article.access =>public o private) e vorrei controllare questo valore prima di "toccare": se questo valore è nonpublic, quindi "tocco" si!

È possibile effettuare "direttamente" nell'istruzione di associazione belongs_to? Se é cosi, come?

risposta

4

Si può provare lambda come hai detto, ma Non sono sicuro che funzioni. Qualcosa di simile a questo:

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

Secondo il implementation forse si può cercare di tornare nil invece di false nel proc, quando non è disponibile

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

Se questo non lo fa opere utilizzano un prima salvare richiamata in questo modo:

class Model < ActiveRecord::Base 
    belongs_to :article 

    before_save :touch_public_parent 

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

Fatemi sapere se avete domande.

Update # 1

La parte rilevante da add_touch_callbacks:

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

Quindi, se si passa vero, allora fa un semplice tocco sul attributo updated_at. Se si passa il nome di un campo, si aggiorna tale campo a meno che non si passi nil. Se passate nil non aggiorna nulla. Ecco perché ho detto che forse puoi provare la seconda versione dell'associazione belongs_to.

+0

Non c'è documentazione relativa al metodo 'add_touch_callbacks' che hai collegato nella tua risposta ... puoi dire qualcosa in più (es: come funziona)? – Backo

+0

@Backo Sicuro, per favore vedi la mia risposta aggiornata. – dombesz

+0

Grazie mille. Ci vediamo alla prossima domanda/risposta! – Backo

0

Non penso che si possa applicare il tocco con una condizione in un'associazione appartiene_a.

C'è un modo che è un po 'hacky ma lavorerà direttamente con un'associazione belongs_to,

Questo non può essere il modo consigliato

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

È possibile utilizzare alcuni 'Proc' /' lambda' nel valore di opzione ': touch'? – Backo

+0

no non è possibile utilizzare un proc o un lambda, citando dalla documentazione, ": touch => Se true, l'oggetto associato verrà toccato (gli attributi aggiornati_at/su impostati ora) quando questo record viene salvato o distrutto. Se si specifica un simbolo, tale attributo verrà aggiornato con l'ora corrente oltre all'attributo updated_at/on. " –

+0

Ho appena aperto un'altra domanda per raggiungere un'altra soluzione: http://stackoverflow.com/questions/8872045/there-is-a-way-to-handle-after-save-and-after-destroy-equally. – Backo

Problemi correlati