отношение rails has_many (4 модели) и как получить доступ в представлении

StackOverflow https://stackoverflow.com/questions/2152302

Вопрос

У меня есть 4 модели:транзакция, transac_data, элемент, 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

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

<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", которая находится "дальше всего" от transac.

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

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

и сделайте это в индексе представления "транзакция"

<%=h transac.dvd_details.name %>

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

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

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

Решение

На самом деле, с Плагин Ian White nested_has_many_through от Ian White, вы можете последовательно соединять has_many throughs так, как вы хотите.Просто установите плагин следующим образом:

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, который можно загрузить и поиграть с ним.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top