簡體   English   中英

如何在兩個Ruby on Rails模型中連接列?

[英]How do I connect columns in two Ruby on Rails models?

我正在將http://bngb.org重寫為Rails項目(我的第一個)。 我已經看過Michael Hartl的教程。 我已經創建了GroupUser模型。 A組belongs_to一個用戶和一個用戶has_one基團,其被破壞與用戶。

每個組的聯系電子郵件地址應該是擁有該組的用戶的電子郵件地址,並且在更改時應更改。 我看到我可以在視圖中使用group.user.email檢索地址,但是看起來這每次都使數據庫調用而不是使用緩存的數據。 有一個鏈接到user.emailgroup.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.

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