[英]How do I connect columns in two Ruby on Rails models?
我正在將http://bngb.org重寫為Rails項目(我的第一個)。 我已經看過Michael Hartl的教程。 我已經創建了Group
和User
模型。 A組belongs_to
一個用戶和一個用戶has_one
基團,其被破壞與用戶。
每個組的聯系電子郵件地址應該是擁有該組的用戶的電子郵件地址,並且在更改時應更改。 我看到我可以在視圖中使用group.user.email
檢索地址,但是看起來這每次都使數據庫調用而不是使用緩存的數據。 有一個鏈接到user.email
的group.email
列的正確方法是什么? 我可以用自己擁有的做嗎,還是需要通過has_one through:
鏈接的第三張表?
非常感謝您的幫助!
傑夫·科維
您可以使用ActiveRecord的after_find
回調將其添加到屬性中。 這是一個例子:
class Group < ApplicationRecord
belongs_to :user
attr_accessor :email
after_find :attach_email
private
def attach_email
self.email = user.email
end
end
當從數據庫中檢索對象時,它將對user
進行初始數據庫調用,然后將其另存為屬性,因此所有后續調用都無需訪問數據庫。
您可以使用委托 。
class Group < ActiveRecord::Base
belongs_to :user
delegate :email, to: :user, allow_nil: true
end
它只會在您第一次使用group.email
時對用戶表進行調用,並將被緩存以供后續調用。
Anurag Aryan的回答暗示delegate
是一個好的開始! 鑒於Rails將緩存數據庫查詢的結果,對您來說可能已經足夠了。 查看這些文檔, 了解Rails為避免查詢數據庫所做的工作 。 也仔細查看您的服務器日志,並在查詢開頭查找CACHE
一詞。
這是(從我的一個應用程序中)要查找的示例:
Unit Load (0.2ms) SELECT "units".* FROM "units" WHERE "units"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/views/guests/reservations/_reservation.html.erb:5
CACHE Unit Load (0.0ms) SELECT "units".* FROM "units" WHERE "units"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/views/guests/reservations/_reservation.html.erb:5
注意第三行的CACHE嗎? 這是Rails報告的查詢未命中數據庫。 如果要避免此附加查詢, eager_load
在獲取組時完全使用eager_load
。 我認為您的情況如下所示:
@groups = Group.eager_load(:user).all
在您的日志中,您應該看到Rails將構造一個查詢,該查詢將您的組和用戶連接在一起,而無需后續查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.