Вопрос

Использование 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 -%>

Спасибо за любую помощь.

Это было полезно?

Решение

Я думаю, ключевая вещь, которую вы упускаете, - это то, что средства поиска и именованные области возвращают только тот класс, к которому они были вызваны.

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

С этой именованной областью действия этот код должен выполнить то, к чему вы стремились.

контроллер:

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

Вид:

<% @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%>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top