Использование имеет много : через
-
18-09-2019 - |
Вопрос
Использование 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%>