Rails 带有数组参数的 where 方法 - 书中的示例,我不清楚

Rails where method with array parameter - example from a book, not clear to me

我正在阅读《Beginning Rails 6 - From Novice to Professional'这本书(很棒的书,顺便说一句),我正在读一章关于Advanced Active Record,很好的信息,但是文本的一部分让我发疯,它有效,但我不明白解释,有人可以给我解释一下吗?

As in a regular where method, you can use arrays as parameters. In fact, you can chain finder methods with other named scopes. You define the recent scope to give you articles recently published: first, you use the published named scope, and then you chain to it a where call

对我来说,代码示例与文本所说的不完全相同(我试图找到任何勘误表,但没有成功):

class Article < ApplicationRecord validates :title, :body, presence: true
belongs_to :user has_and_belongs_to_many :categories has_many :comments

scope :published, -> { where.not(published_at: nil) }
scope :draft, -> { where(published_at: nil) }
scope :recent, -> { where('articles.published_at > ?', 1.week.ago.to_date) }

def long_title
"#{title} - #{published_at}"
end end

我没有看到 You define the recent scope to give you articles recently published: first, you use the published named scope, and then you chain to it a where call,另外,我不能只使用 scope :recent, -> { where('published_at > ?', 1.week.ago.to_date) } 而不是 scope :recent, -> { where('articles.published_at > ?', 1.week.ago.to_date) } 从中删除 articles where?

非常感谢!

所以文字试图表达的是两件事。 一是您可以在 where 中使用数组,活动记录可以理解并将其正确转换为 SQL。例如 Article.where(user_id: [1,2,3]) 将查找 user_id 为 1、2 或 3 的所有文章。

他们试图解释的第二件事是您可以链接作用域。所以在这种情况下,他们试图解释的是你可以这样做:Article.recent.publishedArticle.recent.draft

关于你的最后一个问题,是的,你可以按照你建议的那样写,它会起作用 :recent, -> { where('published_at > ?', 1.week.ago.to_date) }。他们使用 articles. 的原因是为了确保当您尝试使用联接链接作用域时作用域有效。