Rails:为什么此联接查询失败?

时间:2019-01-25 16:15:40

标签: ruby-on-rails activerecord ruby-on-rails-5

我今天穿得很瘦,所以可能我要问的是完全显而易见的事情。

我有两个模型:IssueLanguage。一个问题有一种语言,一种语言有许多问题。

    class Language < ApplicationRecord
      has_many :issues
    end

    class Issue < ApplicationRecord
      belongs_to :language
    end

Issue的语言ID列:

    > Issue.column_names
     => ["id", "created_at", "updated_at", "language_id"]

Language具有以下内容:

    > Language.column_names
     => ["id", "name", "created_at", "updated_at"]

我可以成功创建一个语言行和一个指向该语言的问题行。

    > lang = Language.create(name: 'hello')
    > Issue.create(language: lang)
    > 
    > Issue.first.language.name
    => "hello"

我可以按名称找到语言行:

    > Language.find_by(name: 'hello')
    > => #<Language id: 1, name: "hello", created_at: "2019-01-25 16:06:39", updated_at: "2019-01-25 16:06:39">

但是,如果我尝试使用以下联接,则会陷入困境:

     > Issue.joins(:language).where(language: { name: 'hello' })
     ActiveRecord::StatementInvalid (SQLite3::SQLException: no such column: language.name: SELECT  "issues".* FROM "issues" INNER JOIN "languages" ON "languages"."id" = "issues"."language_id" WHERE "language"."name" = ? ORDER BY "issues"."created_at" DESC LIMIT ?)

拆开SQL,我假设我的查询正在寻找语言名称与'hello'相匹配的语言ID。但除此之外,我还被困住了。

为什么join查询失败?我写的正确吗?是查询本身的问题,还是它可能是在其他地方引起的?

1 个答案:

答案 0 :(得分:2)

您需要在where条件下使用复数形式:

> Issue.joins(:language).where(languages: { name: 'hello' })