【问题标题】:Rails: Why is this join query failing?Rails:为什么这个连接查询失败了?
【发布时间】:2019-01-25 16:15:40
【问题描述】:

我今天穿得很瘦,所以我可能在问一些非常明显的问题。

我有两个模型: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 查询失败?我写对了吗。是查询本身的问题,还是看起来可能是由其他地方引起的?

【问题讨论】:

  • 你想做什么?看起来你应该这样做:Language.find_by(name: 'hello').issues,但我不太确定你的目标是什么。 (如果很明显,请道歉。)
  • 你是对的。 Language.find_by(name: 'hello').issues 更快。
  • ……但有一个我不太明白的区别。我可以在第一个中删除一个名称数组,它将返回所有匹配项,而后者似乎只返回第一个匹配项。我不确定我是否理解正确,但这是另一个问题。

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


【解决方案1】:

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

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

【讨论】:

  • 是的,我明白了。 languages 是对表的引用而不是行。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多