2009-12-09 3 views
2

En utilisant has_many => grâce à l'association.L'utilisation a beaucoup: à travers

Voici ce que j'ai.

: modèle de planification

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

: actes modèle

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

: modèle actcategories

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

: modèle acttype

has_many :acts 

Mon problème Commence ici. Je dois montrer tous les actes par chaque loi type de Plannings qui fait partie de l'association de actcategories En ce moment, je reçois tous les actes et disparus l'association de actcategories.

Contrôleur de planification

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

Planning Afficher la vue

<% @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 -%> 

Merci pour toute aide.

Répondre

1

Je pense que la principale chose qui vous manque est que les finders et les scopes nommés ne retournent que la classe sur laquelle ils sont appelés.

@acts = Actcategory.theacts(@planning) 

@acts est tous les Actcategories où actcategories.planning_id = @planning.id. Ils n'ont pas nécessairement le type d'acte requis.

Vraiment, ce que je pense que vous êtes à la recherche est ce champ nommé:

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

qui limite les actes à ceux qui sont associés à la planification donnée. Ceci peut être appelé sur une association pour limiter les actes liés à ceux associés à une planification spécifique. Exemple: @acts contient des actes de type act, x, associés à la planification, y.

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

Avec cette portée nommée, ce code devrait accomplir ce que vous visiez.

contrôleur

:

Vue:

<% @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%> 
Questions connexes