Pergunta

Usando has_many => através da associação.

Aqui está o que eu tenho.

: modelo de planejamento

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

: age modelo

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

: actcategories modelo

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

: Modelo acttype

has_many :acts

Meu problema começa aqui. Eu preciso mostrar todos os Atos por cada Act Tipo de Plannings que faz parte do actcategories associação Agora eu estou recebendo todos os atos e faltando o actcategories associação .

Planejamento Controlador

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

Planejamento Show View

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

Obrigado por qualquer ajuda.

Foi útil?

Solução

Eu acho que a principal coisa que está faltando é que localizadores e escopos nomeados retornar apenas a classe que eles são chamados por diante.

@acts = Actcategory.theacts(@planning)

@acts é tudo o Actcategories onde actcategories.planning_id = @planning.id. Eles não têm necessariamente o tipo de ato necessário.

Realmente, o que eu acho que você está procurando esse escopo nomeado:

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

que limita age para aqueles associados com o planejamento dado. Isso pode ser chamado de uma associação para limitar os atos vinculados aos associados com um planejamento específico.

Exemplo:. @Acts contém atos de acttype, x, que estão associados com o planejamento, y

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

Com este escopo nomeado este código deve realizar o que você estava buscando.

controlador:

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

vista:

<% @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 <%=@planning.name%> through 
     actcatgetories: <%=act.name%>
  <%end%>
<%end%>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top