2009-12-09 2 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%> 
Смежные вопросы