刚刚开始使用 ActiveRecord(在 sinatra 应用程序中)。尝试将现有查询移植到 AR,但有点卡住了。
如果我有用户和个人资料的has_one关系(不幸的是使用旧表)
class User < ActiveRecord::Base
self.table_name = "systemUsers"
self.primary_key = "user_id"
has_one :profile, class_name: 'Profile', foreign_key: 'profile_user_id'
end
class Profile < ActiveRecord::Base
self.table_name = "systemUserProfiles"
self.primary_key = "profile_id"
belongs_to :user, class_name: "User", foreign_key: 'user_id'
end
如果我想使用内部联接查询所有具有个人资料的用户,然后使用一个查询从个人资料中获取 user_age 字段,我可以这样做吗?
例如 (刚刚添加 .first 以减少代码,但将遍历所有具有配置文件的用户)
user = User.all(:joins => :profile).first
user.profile.user_age
给我正确的数据,并为第一个查询使用内部联接,但随后发出第二个查询以获取配置文件数据
它还给出了一个折旧的警告并建议我使用负载,我尝试过但不会使用内部连接。
类似的情况
user = User.joins(:profile).first
user.profile.user_age
我得到一个内部连接,但每个用户行都有一个查询。
我试过包括
user = User.includes(:profile).first
user.profile.user_age
这种延迟加载配置文件并会减少循环中的查询数量,但是我认为它也会拉动没有配置文件的用户
我也试过参考
user = User.includes(:profile).references(:profile).first
user.profile.user_age
这为我提供了正确的数据并将查询减少到 1,但使用了LEFT JOIN
我可能还没有完全掌握它并且正在尝试实现一些不可行的事情,我想我可能需要使用包含并检查循环内的 nil 配置文件,或者使用连接并接受每一行的附加查询。
以为我会检查以防我遗漏了一些明显的东西。
干杯
拍。