簡體   English   中英

Rails ActiveRecord-如何繼承所有子關聯?

[英]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_toreferences宏將執行此操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM