You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:00:57