Ruby on Rails中如何通过启用账号查询启用站点?
解决方案
要获取所有属于启用状态账户的启用状态站点,同时保留ActiveRecord::Relation以支持后续链式调用,有两种简洁实现方式:
方式一:从Site模型直接关联查询
利用joins关联Account模型,再通过merge复用已有的作用域,代码简洁且可读性高:
Site.enabled.joins(:account).merge(Account.enabled)
或者直接通过where条件指定Account的状态:
Site.enabled.joins(:account).where(accounts: { status: :enabled })
两种写法都会返回Site类型的ActiveRecord::Relation,可以继续链式调用其他查询方法(比如order、limit等)。
方式二:在Account模型中封装作用域
如果需要经常使用这个查询,可以在Account模型里封装一个自定义作用域:
class Account < ApplicationRecord has_many :sites enum status: [:enabled, :disabled, :archived, :deleted] def self.enabled_sites enabled.joins(:sites).merge(Site.enabled) end end
之后直接调用Account.enabled_sites就能得到目标结果,同样是ActiveRecord::Relation类型。
为什么原有方案不可行
Account.enabled返回的是Account类型的ActiveRecord::Relation,而.sites是单个Account实例的关联方法,无法直接在Relation上调用。Account.enabled.each(&:sites)会遍历每个Account实例并收集其sites,最终得到的是数组,自然无法继续链式调用查询方法。
内容的提问来源于stack exchange,提问作者Keleron
相关产品推荐
相关产品推荐

