2

我有这样愤怒的联想:融资>-事件>-子程序>-程序。我想通过所有这些程序从程序中访问 last_financings ,所以代码是:

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

因此,当我想在 after_initialize 函数中访问 subprogram_last_actual_financings 时,出现此错误

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

但我的关联中有 :source 选项。我究竟做错了什么?

4

3 回答 3

6

您得到的错误是关于 source_reflection 是无效关联,因为 has_many through 的源必须是 belongs_to、has_one 或 has_many 而没有 through 选项。所以你不能使用 :last_actual_financings 作为来源。

于 2009-12-21T09:25:54.117 回答
3

据我记得你不能与双(或更多)关联:通过。您唯一能做的就是编写自己的 sql 查询。

这是我的示例如何执行此操作:

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

这适用于关系 Person -> has_many -> team_members -> has_many -> team_roles -> has_one - 团队。

希望能帮助到你。

于 2009-12-21T09:42:46.720 回答
0

这似乎是一种非常尴尬的方式......我宁愿制作一个虚拟访问器Program,调用类似这样的东西:

self.subprograms.first.events.first.financings.first(:order => 'date DESC')
于 2009-12-18T16:16:07.433 回答