Question

Je ces associations en colère: financements> -> - Événements> - programmes sous-programmes. Je veux obtenir accès à des programmes last_financings par tous si le code est:

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

Alors, quand je veux accéder à subprogram_last_actual_financings en fonction after_initialize je reçois cette erreur

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

mais j'ai: l'option source dans mes associations. Qu'est-ce que je fais mal?

Était-ce utile?

La solution

L'erreur que vous obtenez est sur le point source_reflection est une association non valide, car source de has_many par doit être belongs_to, has_one ou sans has_many par l'option. Donc, vous ne pouvez pas utiliser. Last_actual_financings comme source

Autres conseils

Pour autant que je me souviens que vous ne pouvez pas faire l'association avec le double (ou plus): par. La seule chose que vous pouvez faire est d'écrire vos propres requêtes SQL.

Voici mon exemple comment le faire:

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

Ceci est pour la relation personne -> has_many -> team_members -> has_many -> team_roles -> has_one -. Équipe

it helps.

Cela semble être une façon vraiment bizarre de faire ça ... Je préfère faire un accesseur virtuel Program qui appelle quelque chose comme ceci:

self.subprograms.first.events.first.financings.first(:order => 'date DESC')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top