【发布时间】:2019-01-25 16:15:40
【问题描述】:
我今天穿得很瘦,所以我可能在问一些非常明显的问题。
我有两个模型:Issue 和 Language。一个问题有一种语言,一种语言有很多问题。
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