[英]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.