Macro de reflexão de fonte inválida: Has_Many: através de
-
20-09-2019 - |
Pergunta
Eu tenho associações tão irritadas: financiamentos>- Eventos>- Subprogramas>- Programas. Quero fazer com que o Aces seja o Last_Financings de programas até todos eles, então o código é:
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
Então, quando eu quero acessar o subprograma_last_actual_financings na função After_initialize, recebo este erro
Invalid source reflection macro :has_many :through for has_many :subprogram_last_actual_financings, :through => :fcp_subprograms. Use :source to specify the source reflection.
Mas eu tenho: opção de origem em minhas associações. O que estou fazendo errado?
Solução
O erro que você recebe é sobre fonte_reflexão é uma associação inválida, porque a fonte do Has_Many através do deve ser pertencente_to, has_one ou has_many sem opção através. Portanto, você não pode usar: last_actual_financings como fonte.
Outras dicas
Tanto quanto me lembro, você não pode fazer associação com o dobro (ou mais): através. A única coisa que você pode fazer é escrever suas próprias consultas SQL.
Aqui está o meu exemplo de como fazer isso:
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
Isto é para a relação de relação -> has_many -> team_members -> has_many -> team_roles -> has_one -equipe.
Espero que ajude.
Parece uma maneira realmente estranha de fazer isso ... eu prefiro fazer um acessador virtual em Program
Isso chama algo assim:
self.subprograms.first.events.first.financings.first(:order => 'date DESC')