我今天穿得很瘦,所以可能我要问的是完全显而易见的事情。
我有两个模型: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
查询失败?我写的正确吗?是查询本身的问题,还是它可能是在其他地方引起的?
答案 0 :(得分:2)
您需要在where条件下使用复数形式:
> Issue.joins(:language).where(languages: { name: 'hello' })