Non valido fonte riflessione macro: has_many: attraverso
-
20-09-2019 - |
Domanda
Non ho tali associazioni arrabbiati: finanziamenti> -> Eventi -> sottoprogrammi - programmi. Voglio ottenere accesso al last_financings da programmi attraverso tutti loro in modo da codice è:
class Fcp < Program
has_many :fcp_subprograms,
:foreign_key => 'parent_id'
has_many :subprogram_last_actual_financings,
:through => :fcp_subprograms,
:source => :last_actual_financings
class FcpSubprogram < Program
belongs_to :fcp,
:class_name => 'Fcp',
:foreign_key => 'parent_id'
has_many :events,
:foreign_key => 'fcp_id'
has_many :last_actual_financings,
:through => :events,
:source => :last_actual_financings
class Event < ActiveRecord::Base
belongs_to :fcp,
:class_name => 'Fcp',
:foreign_key => 'fcp_id'
belongs_to :fcp_subprogram,
:class_name => 'FcpSubprogram',
:foreign_key => 'fcp_id'
has_many :last_actual_financings,
:class_name => 'ActualFinancing',
:order => 'date DESC',
:limit => 1
Così, quando voglio accedere a subprogram_last_actual_financings in after_initialize funzione ottengo questo errore
Invalid source reflection macro :has_many :through for has_many :subprogram_last_actual_financings, :through => :fcp_subprograms. Use :source to specify the source reflection.
ma ho: opzione source nelle mie associazioni. Che cosa sto facendo di sbagliato?
Soluzione
L'errore che si ottiene è di circa source_reflection è un'associazione non valida, in quanto fonte di has_many attraverso deve essere belongs_to, has_one o has_many senza tramite l'opzione. Così non si può utilizzare:. Last_actual_financings come fonte
Altri suggerimenti
Per quanto mi ricordo, non è possibile effettuare l'associazione con il doppio (o più): attraverso. L'unica cosa che puoi fare è scrivere i propri query SQL.
Ecco il mio esempio come fare:
class Person
...
has_many :teams, :finder_sql =>
'SELECT DISTINCT teams.* FROM teams
INNER JOIN team_roles ON teams.id = team_roles.team_id
INNER JOIN team_members ON team_roles.id = team_members.role_id
WHERE ((team_members.person_id = #{id}))'
# other standard associations
has_many :team_members
has_many :team_roles,
:through => :team_members
# and I couldn't do:
# has_many :teams, :through => :team_roles
Questo è per persona relazione -> has_many -> team_members -> has_many -> team_roles -> has_one -. Squadra
Speranza che aiuta.
Questo mi sembra un modo davvero imbarazzante di fare questo ... io preferirei fare un accesso virtuale a Program
che richiama qualcosa di simile:
self.subprograms.first.events.first.financings.first(:order => 'date DESC')