假设我有一个User模型,它带有一个名为email_notifications的boolean标志。这让我们知道这个用户是否关心从应用程序接收电子邮件通知。
最近,我一直在将所有这些标志和设置移动到一个单独的子模型调用Preference中,以使其远离核心用户模型。User has_one Preference.
class User < ActiveRecord::Base
has_one :preference, dependent: :destroy
accepts_nested_attributes_for :preference
scope :email_recipients, -> { where(preference: { email_notification: true} ) }
def can_receive_email?
preference.email_notification
end
end如您所见,我在模型上有一个助手作用域和一个助手方法。
但是,既然它位于另一个表中,我总是先查询关联:preference,然后得到所需的值。它不再直接从User模型本身获得。
这算不算糟糕的做法?或者Rails是否帮助出并缓存相关的模型,这样它就不必每次都重新查询?我喜欢把我的各种信任安排在一个单独的模型中,我确实认为这是一个很好的实践,但这种不断重新查询的潜在成本正在阻止我。
谢谢!
编辑:
我知道我可以做User.includes(:preference).blah_blah,但是我想避免在我调用用户的每一个地方更新它,而且可能并不总是提前知道我是否要查询子模型并需要包括一个.includes()。
发布于 2016-04-06 18:18:18
Rails关联在被访问后存储在内存中,因此调用user.preference除了第一次被引用之外不会访问数据库。
而且,在这种情况下,includes不会产生多大影响,因为这是一个has_one。includes通常用于在单个更大的查询中加载许多关联,而不是每次调用子对象时都访问数据库。
https://stackoverflow.com/questions/36458571
复制相似问题