以下是我的两个模型:
class Author < ApplicationRecord
has_many :articles
end
class Article < ApplicationRecord
belongs_to :author
scope :articles_by_author, ->(author_id) {joins(:author).where(author: {id: author_id})}
end
我正在努力让Article.articles_by_author(id)
范围发挥作用。基本上:它应该返回特定作者的所有文章。
以下是发生的事情:
首先我抓住了一位作者:
author = Author.first
然后我运行查询:
Article.articles_by_author(author)
生成的SQL看似正确:
SELECT "articles".*
FROM "articles"
INNER JOIN "authors"
ON "authors"."id" = "articles"."author_id"
WHERE "author"."id" = 1
但它出现以下错误:
ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:没有这样的列:author.id:SELECT&#34; articles&#34;。* FROM&#34; articles&#34; INNER JOIN&#34;作者&#34; ON&#34;作者&#34;。&#34; id&#34; =&#34;文章&#34;。&#34; author_id&#34;在哪里&#34;作者&#34;。&#34; id&#34; = 1
我在这个范围内弄乱了什么?我想将哈希语法保留在此范围内。
答案 0 :(得分:3)
在joins
/ includes
中,您可以使用模型名称,但在where
子句中,您应该使用数据库表名,因此复数为authors
:
scope :articles_by_author, lambda { |author_id|
joins(:author).where(authors: { id: author_id })
}
P.S。我已经设计了一些符合(Rubocop)惯例的代码:)
P.P.S。是不是更容易(我们知道author_id
)只是:
Author.find(author_id).articles # ? :)
答案 1 :(得分:2)
因为你有一个直接的has_many / belongs_to,你可以做到
class Article < ApplicationRecord
belongs_to :author
scope :articles_by_author, ->(author_id) { where(author_id: author_id) }
end
或Article.where(author_id: author_id)
您不需要联接