ActiveRecord, has_many: through e associazioni polimorfiche

gente,

Voglio assicurarmi di averlo capito correttamente. E per favore trascura il caso dell’eredità qui (SentientBeing), cercando di concentrarsi invece sui modelli polimorfici in has_many: attraverso le relazioni. Detto questo, considera quanto segue …

class Widget  :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'" has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'" end class Person  grouper has_many :widgets, :through => :widget_groupings end class Alien  grouper has_many :widgets, :through => :widget_groupings end class WidgetGrouping  true end 

In un mondo perfetto, mi piacerebbe, dato un Widget e una persona, fare qualcosa come:

 widget.people << my_person 

Tuttavia, quando faccio questo, ho notato che il “tipo” di “grouper” è sempre nullo in widget_groupings. Tuttavia, se io a qualcosa di simile al seguente:

 widget.widget_groupings < self, :person => my_person}) 

Quindi tutto funziona come mi sarei normalmente aspettato. Non penso di aver mai visto questo accadere con associazioni non polimorfiche e volevo solo sapere se questo era qualcosa di specifico in questo caso d’uso o se potenzialmente sto fissando un bug.

    Grazie per qualsiasi aiuto!

    C’è un problema noto con Rails 3.1.1 che rompe questa funzionalità. Se stai riscontrando questo problema, prova prima l’aggiornamento, è stato corretto in 3.1.2

    Sei così vicino Il problema è che stai abusando dell’opzione: source. : source dovrebbe puntare alla relazione polymorphic belongs_to. Quindi tutto ciò che devi fare è specificare: source_type per la relazione che stai cercando di definire.

    Questa correzione al modello Widget dovrebbe consentire di fare esattamente quello che stai cercando.

     class Widget < ActiveRecord::Base has_many :widget_groupings has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person' has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien' end 

    Come accennato in precedenza, questo non funziona con le rotaie 3.1.1 a causa di un bug su: source, ma è stato risolto in Rails 3.1.2

    ha molti: attraverso e polimorfico non funzionano insieme. Se tenti di accedervi direttamente, dovrebbe generare un errore. Se non sbaglio, devi scrivere a mano widget.people e la routine push.

    Non penso che sia un bug, è solo qualcosa che non è ancora stato implementato. Immagino di vederlo nella funzione, perché tutti hanno un caso in cui potrebbero usarlo.