guide di has_many relazione (4 modelli) e le modalità di accesso in vista
-
23-09-2019 - |
Domanda
Ho 4 modelli:transac, transac_data, elemento, 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
Ora nel "transac" vedi, ho bisogno di accedere roba da tutti questi modelli, come:
<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 %>
MA ho anche bisogno di accedere ad alcune informazioni da "DvdDetails" modello "più lontana" lontano da transac.
Ho capito che fa qualcosa di simile, non sarebbe davvero il lavoro:
class Transac < ActiveRecord::Base
has_many :transac_datas
has_many :items, :through => :transaction_datas
has_many :dvd_details, :through => :items, :through => :transaction_datas
end
e per fare questo l'indice di "transac" vista
<%=h transac.dvd_details.name %>
Cosa devo fare per ottenere questo?
Qualsiasi aiuto è gradito!Grazie!
Soluzione
In realtà, con Ian White nested_has_many_through plugin, è possibile collegare in daisy-chain has_many through modo che si desidera.Basta installare il plugin in questo modo:
script/plugin install git://github.com/ianwhite/nested_has_many_through.git
Quindi impostare il vostro modello come questo:
class Transac < ActiveRecord::Base
has_many :transaction_datas
has_many :items, :through => :transaction_datas
has_many :dvd_details, :through => :items
end
Questo dovrebbe fare quello di cui hai bisogno.
AGGIORNAMENTO: Questa domanda è venuto un paio di volte di recente.Ho scritto un articolo, nidificazione tuo has_many :attraverso le relazioni, per spiegare in dettaglio.È dotato anche di un accompagnamento esempio di applicazione su GitHub per scaricare e giocare con.