2009-12-09 121 views
2

使用has_many =>通過關聯。使用有很多:通過

這是我的。

:規劃模型

has_many :acttypes 
has_many :actcategories 
has_many :acts, :through => :actcategories 

:行爲模型

belongs_to :acttype 
has_many :actcategories 
has_many :plannings, :through => :actcategories 

:actcategories模型

named_scope :theacts, lambda { |my_id| 
{:conditions => ['planning_id = ?', my_id] }} 
belongs_to :act 
belongs_to :planning 

:acttype模型

has_many :acts 

我的問題從這裏開始。我需要每個幕式規劃方法那就是actcategories協會 的一部分,現在我讓所有的行爲和缺少actcategories協會顯示所有行爲

規劃控制器

def show 
@planning = Planning.find(params[:id]) 
@acttypes = Acttype.find(:all, :include => :acts) 
@acts = Actcategory.theacts(@planning) 
end 

規劃顯示視圖

<% @acttypes.each do |acttype|%> 
<%= acttype.name %> 

<% @acts.each do |acts| %> 
<li><%= link_to acts.act.name, myacts_path(acts.act, :planning => @planning.id) %></li> 
<% end %> 
<% end -%> 

感謝您的幫助。

回答

1

我想你錯過了關鍵的是,發現者和命名範圍只會返回他們呼籲級。

@acts = Actcategory.theacts(@planning) 

@acts是所有Actcategories其中actcategories.planning_id = @planning.id。他們不一定具有所需的行爲類型。

真的,我想你要找的是這個命名範圍:

class Act < ActiveRecord::Base 
    named_scope :with_planning, lambda do |planning_id| 
    { :joins => :actcategories, 
    :conditions => {:actcategories => {:planning_id => planning_id}} 
    } 
    ... 
end 

哪些限制行爲與給定的規劃有關的。這可以在關聯上調用,以將關聯的行爲限制爲與特定計劃關聯的關聯行爲。

示例:@acts包含與計劃相關聯的acttype x的行爲y。

@acts = Acttype.find(x).acts.with_planning(y) 

有了這個命名範圍的代碼應該完成什麼你瞄準。

控制器:

視圖:

<% @acttypes.each do |acttype| %> 
<h2> <%= acttype.name %><h2> 
    <% acttype.acts.with_planning(@planning) do |act| %> 
    This act belongs to acttype <%= acttype.name%> and 
    is associated to <%[email protected]%> through 
    actcatgetories: <%=act.name%> 
    <%end%> 
<%end%>