Usando tem muitos: através
-
18-09-2019 - |
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.
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%>