отношение rails has_many (4 модели) и как получить доступ в представлении - PullRequest
0 голосов
/ 28 января 2010

У меня есть 4 модели: transac, transac_data, item, dvd_details

class Transac < ActiveRecord::Base
  has_many :transac_datas
  has_many   :items, :through => :transaction_datas
end

class TransactionData < ActiveRecord::Base
  belongs_to :item
  belongs_to :transaction
end

class Item < ActiveRecord::Base
  has_many   :transaction_datas
  has_many   :transacs, :through => :transaction_datas
end

class DvdDetails < ActiveRecord::Base
  has_many :items
end

Теперь в представлении "transac" мне нужно получить доступ ко всем этим моделям, таким как:

<td><%=h transac.status %></td>
<% transac.transaction_datas.each do |td| %>
  <td><%=h td.item_type %></td>
<% end %>

<% transac.items.each do |item| %>
  <td><%=h item.item_type %></td>
<% end %>

НО мне также нужен доступ к некоторой информации из модели "DvdDetails", которая является "самой отдаленной" от трансаки.

Я понял, что сделать что-то подобное не получится:

class Transac < ActiveRecord::Base
  has_many :transac_datas
  has_many :items, :through => :transaction_datas
  has_many :dvd_details, :through => :items, :through => :transaction_datas
end

и сделать это в индексе представления "transac"

<%=h transac.dvd_details.name %>

Что мне нужно сделать, чтобы достичь этого?

Любая помощь приветствуется! Спасибо!

1 Ответ

0 голосов
/ 28 января 2010

На самом деле, с помощью плагина nested_has_many_through Иэна Уайта , вы можете последовательно подключать has_many по желанию. Просто установите плагин так:

script/plugin install git://github.com/ianwhite/nested_has_many_through.git

Затем настройте свою модель так:

class Transac < ActiveRecord::Base
  has_many :transaction_datas
  has_many :items, :through => :transaction_datas
  has_many :dvd_details, :through => :items
end

Это должно делать то, что вам нужно.

ОБНОВЛЕНИЕ: Этот вопрос недавно поднимался несколько раз. Я написал статью, вложившую ваше has_many: через отношения , чтобы объяснить подробно. У него даже есть пример приложения на GitHub, с которым можно скачать и поиграть.

...