Pregunta

Tengo este tipo de asociaciones de ira: financiaciones> - eventos> -> - subprogramas programas. Quiero obtener acceso a last_financings de programas a través de todos ellos para que el código es:

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

Así que cuando quiero acceder a subprogram_last_actual_financings en función after_initialize consigo este error

Invalid source reflection macro :has_many :through for has_many :subprogram_last_actual_financings, :through => :fcp_subprograms.  Use :source to specify the source reflection.

pero tengo: opción de fuente en mis asociaciones. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

El error que se obtiene es de aproximadamente source_reflection es una asociación no válida, porque a través de fuente de has_many debe ser belongs_to, has_one o sin has_many través de la opción. Por lo tanto no se puede utilizar:. Last_actual_financings como fuente

Otros consejos

Por lo que yo recuerdo no se puede hacer asociación con el doble (o más): a través. La única cosa que puede hacer es escribir sus propias consultas SQL.

Aquí está mi ejemplo de cómo hacerlo:

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

Esta es la Persona relación -> has_many -> team_members -> has_many -> team_roles -> has_one -. Equipo

Espero que ayuda.

Esto parece ser una manera muy incómodo de hacer esto ... yo prefiero hacer un descriptor de acceso virtual en Program que llama a algo como esto:

self.subprograms.first.events.first.financings.first(:order => 'date DESC')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top