我面临着 Ruby on Rails 的常见问题。我确实有嵌套的
has_many
关系
帐户 > has_many > 站点 > has_many > 页面 > has_many > 块
class Site < ApplicationRecord
belongs_to :account
enum status: [:enabled, :disabled, :archived, :deleted]
end
class Account < ApplicationRecord
has_many :sites
enum status: [:enabled, :disabled, :archived, :deleted]
end
在示例中如何查询所有启用的站点?我可以通过
Site.enabled
来使用示波器。我也可以使用Account.enabled
。但我不能使用 Account.enabled.sites
因为 enabled
作用域返回一个 active_relation。 Rails 有没有一种干净的方法来实现这一点?
我当前的解决方法是
Account.enabled.each(&:sites)
,但现在它是一个数组而不是一个active_relation!所以这样做 Account.enabled.each(&:sites).enabled
并不能正确过滤。
我浏览了 Rails api 文档,寻找一个
each
,它保留了 active_relation 类而不是返回数组。
不,没有内置的方法可以做你想做的事。我会从
Site
一侧执行此操作,方法是在 Site
内创建一个范围,该范围仅返回那些具有关联的 enabled
Account
s:
scope :with_enabled_account, -> { joins(:account).merge Account.enabled }