2009-12-18 59 views
2

我有這樣的憤怒的協會:financings> - events> - subprograms> - programs。我想通過他們都獲得查看在程序last_financings這樣的代碼是:無效的源反射宏:has_many:通過

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 

所以,當我想訪問subprogram_last_actual_financings在after_initialize功能我得到這個錯誤

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

但我有:來源選項在我的協會。我究竟做錯了什麼?

回答

6

你得到的錯誤是關於source_reflection是無效的關聯,因爲has_many通過的源必須是belongs_to,has_one或has_many而不通過選項。所以你不能使用:last_actual_financings作爲來源。

+3

你可以試試nested_has_many_through插件http://github.com/ianwhite/nested_has_many_through 使用rails-2.3分支,儘管它是實驗性的。我沒有嘗試過。 或者您可以使用finder_sql選項for has_many – 2009-12-21 09:51:46

+0

有趣的插件!我必須試一試 – klew 2009-12-21 10:04:47

+0

非常感謝您的建議! – Antiarchitect 2009-12-21 10:06:02

0

這似乎是這樣做的真正尷尬的方式......我寧願做一個虛擬的訪問中Program調用是這樣的:

self.subprograms.first.events.first.financings.first(:order => 'date DESC') 
+0

但是我需要爲所有的程序子程序中的所有事件融資。融資模式的行爲類似於融資日期變化的歷史。所以真正的重要性只有最後一次融資。爲了計算項目的融資額,我應該對所有項目活動的最後融資進行總結,並對所有子項目的所有活動的最後融資進行總結。類似 – Antiarchitect 2009-12-19 01:36:12

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 

這是關係人 - >的has_many - > team_members - >的has_many - > team_roles - > HAS_ONE - 團隊。

希望它有幫助。

+0

感謝您的諮詢! – Antiarchitect 2009-12-21 10:05:13