![](/img/trans.png)
[英]In Ruby on Rails, does a child class inherit the parent class' associations?
[英]Rails activerecord - how to inherit all child associations?
因此,在我的應用程序中,我具有人員和服裝模型。 在我的人員顯示控制器中,我得到如下列表:
@people = Person.where("description LIKE ?", "%#{params[:description]}%")
在我看來,我向每個人展示了這樣的服裝:
<% @people.each do |person| %>
<p> Name: <%= person.name %> </p>
<% @outfits = person.outfits %>
<% @outfits.each do |outfit|
<p> Name: <%= outfit.name %> </p>
<p> Description: <%= outfit.description %> </p>
<% end %>
<% end %>
但是,正如我在頁面上加載很多人一樣,為每個人加載服裝要花很長時間。 有什么方法可以繼承每個人的服裝,這樣我就不必等待很長時間才能加載頁面? 還是加快速度以在服裝和人之間建立索引的唯一方法? 謝謝你的幫助
使用聯接加載相關記錄:
@people = Person.eager_load(:outfits)
.where("description LIKE ?", "%#{params[:description]}%")
.limit(20) # optional
否則,您將遇到所謂的N + 1查詢問題,其中通過@people
進行的每次迭代@people
將導致單獨的數據庫查詢來獲取服裝。
是的, outfits.person_id
或任何創建關聯的列都應具有外鍵索引。 默認情況下,在遷移中使用belongs_to
或references
宏將執行此操作:
create_table :outfits do |t|
t.belongs_to :person, foreign_key: true
end
您應該設置如下限制:
@people = Person.where("description LIKE ?", "%#{params[:description]}%").limit(20)
根據您的喜好更改號碼。
您可以使用.joins
或.includes
如果您有一個滿是Person的表,並且使用:joins =>服裝來提取所有服裝信息以進行排序,等等,這將很好用,並且所需的時間比:include少,但是您要顯示Person。要使用:joins獲取信息,必須使用它獲取的每個用戶分別進行SQL查詢,而如果使用:include,則可以使用此信息。
解
Person.includes(:outfits).where("description LIKE ?", "%#{params[:description]}%")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.