Rails范围与哈希语法

时间:2016-09-27 14:34:18

标签: ruby-on-rails ruby activerecord

以下是我的两个模型:

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

我在这个范围内弄乱了什么?我想将哈希语法保留在此范围内。

2 个答案:

答案 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)

您不需要联接