Usando tiene muchos: a través
-
18-09-2019 - |
Pregunta
Uso has_many => través de la asociación.
Aquí es lo que tengo.
: modelo de planificación
has_many :acttypes
has_many :actcategories
has_many :acts, :through => :actcategories
: actos 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
Mi problema comienza aquí. Necesito demostrar todo Hechos por cada Ley Tipo Planificaciones que forma parte de la asociación actcategories En este momento estoy recibiendo todos los actos y desaparecidos la asociación actcategories .
Controlador de Planificación
def show
@planning = Planning.find(params[:id])
@acttypes = Acttype.find(:all, :include => :acts)
@acts = Actcategory.theacts(@planning)
end
Planificación 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 -%>
Gracias por cualquier ayuda.
Solución
Creo que la clave que se está perdiendo es que buscadores y alcances mencionados sólo devuelven la clase que se llaman sucesivamente.
@acts = Actcategory.theacts(@planning)
@acts es donde todos los Actcategories actcategories.planning_id = @planning.id
. Ellos no necesariamente tienen el tipo de acto necesario.
En realidad, lo que creo que estás buscando es este ámbito con nombre:
class Act < ActiveRecord::Base
named_scope :with_planning, lambda do |planning_id|
{ :joins => :actcategories,
:conditions => {:actcategories => {:planning_id => planning_id}}
}
...
end
lo que limita los actos a los asociados con la planificación dada. Esto puede ser llamado en una asociación para limitar los actos vinculados a los asociados con una planificación específica.
Ejemplo: @acts contiene actos de acttype, x, que están asociados con la planificación, y
.@acts = Acttype.find(x).acts.with_planning(y)
Con este ámbito con nombre este código debe lograr lo que se proponían.
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%>