Ruby on rails 通过Rails 4中的“属于”关系查询记录

Ruby on rails 通过Rails 4中的“属于”关系查询记录,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我希望对通过Rails 4中的“属于”关系查询记录的正确方法有一点澄清 我想找到所有具有特定类别名称的零件 我可以使用:Part.where(category\u ID:“1”) 但我不能把它和名字联系起来 如果我这样做: Part.joins(:categories).where("categories.name = 'cars'").first 我得到了这个错误: ActiveRecord::ConfigurationError:在部件上找不到名为“categories”的关联;也许你拼错

我希望对通过Rails 4中的“属于”关系查询记录的正确方法有一点澄清

我想找到所有具有特定类别名称的零件

我可以使用:
Part.where(category\u ID:“1”)

但我不能把它和名字联系起来

如果我这样做:

Part.joins(:categories).where("categories.name = 'cars'").first
我得到了这个错误:

ActiveRecord::ConfigurationError:在部件上找不到名为“categories”的关联;也许你拼错了

我不知道我在哪里拼错了什么,也不知道为什么它不起作用。任何帮助都将不胜感激

类别模型:

class Category < ActiveRecord::Base
  has_many :parts
end
零件表:

CREATE TABLE parts
(
  id serial NOT NULL,
  category_id integer,
  CONSTRAINT parts_pkey PRIMARY KEY (id)
)
使用:
Part.join(:category)

传递给
joins
的关联名称应该与您的声明相似:
属于:category
。这里您使用的是
:category
,所以给
连接
相同的符号。

使用:
部分。连接(:category)


传递给
joins
的关联名称应该与您的声明相似:
属于:category
。这里您使用了
:category
,因此给
联接
相同的符号。

您的
所属的
关联名称在
部分
模型中是单数的(这是正确的,因为它是标准的),但是您尝试使用复数的关联名称(您尝试了
:categories
)。常见的错误;您可能混淆了数据库命名约定和rails关联命名约定。请尝试以下方法:

Part.joins(:category).where('categories.name = "cars"').first
旁注: 这与问题无关,但如果您还不知道,也可以在where子句中使用哈希。它看起来像:

where(categories: {name: "cars"})

结果是一样的。在您的情况下,它是不相关的,因为您显然传递了一个文本字符串,但当您使用表单数据或其他同样不安全的数据时,它可能会派上用场,因为哈希方法会正确地将参数视为文本,而不是危险地将其按原样放入查询。

您的
所属的
关联名称在
部分
模型中是单数的(这是正确的,因为它是标准的),但您尝试使用复数关联名称加入(您尝试了
:categories
)。常见的错误;您可能混淆了数据库命名约定和rails关联命名约定。请尝试以下方法:

Part.joins(:category).where('categories.name = "cars"').first
旁注: 这与问题无关,但如果您还不知道,也可以在where子句中使用哈希。它看起来像:

where(categories: {name: "cars"})

结果是一样的。在您的情况下,这是不相关的,因为您显然是在传递一个文本字符串,但当您使用表单数据或其他同样不安全的数据时,它可能会派上用场,因为哈希方法会正确地将参数视为文本,而不是危险地将其按原样放在查询中。

我正在尝试让它立即工作-Part.where(categories:{name:“cars”})但我一直在回复:::Part Load(0.5ms)选择“parts”。*从“parts”中选择“categories”。“name”=“cars”PG::未定义:错误:从表“categories”的子句条目中丢失:::有什么想法可能导致错误吗?@newusername这里您仍然需要
连接(:categority)
part。否则将不会执行
内部联接
,SQL将不知道
categories
引用的含义。我现在正在尝试让它工作-part.where(categories:{name:“cars”}),但我一直返回:::零件加载(0.5ms)选择“parts”。*从“parts”中选择“categories”。“name”='cars'PG::UndefinedTable:ERROR:从表“categories”的子句条目中丢失:::知道什么可能导致该错误吗?@newusername这里您仍然需要
连接(:category)
部分。否则
内部连接将不会执行,SQL将不知道
类别
引用的含义。