Ruby on rails ActiveRecord:条件为“”的查询属于关联

Ruby on rails ActiveRecord:条件为“”的查询属于关联,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个表事务和表用户 transactions id user_id users id user_role 下面是类事务: class Transaction < ApplicationRecord belongs_to :user end 但我遇到了这个错误: ActiveRecord::语句无效:PG::UndefinedTable:错误:缺少 表“用户”的FROM子句条目 我的问题是:如何查询所属的关联 :联接只会联接表并返回所选字段。若对联接

我有一个表
事务
和表
用户

transactions
   id
   user_id
users
   id
   user_role
下面是类
事务

class Transaction < ApplicationRecord
     belongs_to :user
end
但我遇到了这个错误:

ActiveRecord::语句无效:PG::UndefinedTable:错误:缺少 表“用户”的FROM子句条目


我的问题是:如何查询
所属的
关联

:联接
只会联接表并返回所选字段。若对联接查询结果调用关联,它将再次触发数据库查询

:includes
将加载包含的关联并将其添加到内存中<代码>:includes
加载所有包含的表属性。如果在include查询结果上调用关联,它将不会触发任何查询

您需要做的是:

SaleTransaction.joins(:user).where("users.user_role = 2")

:联接
将只联接表并返回所选字段。若对联接查询结果调用关联,它将再次触发数据库查询

:includes
将加载包含的关联并将其添加到内存中<代码>:includes
加载所有包含的表属性。如果在include查询结果上调用关联,它将不会触发任何查询

您需要做的是:

SaleTransaction.joins(:user).where("users.user_role = 2")

您应该在where子句中指定表名。试一试

SaleTransaction.includes(:user).where(用户:{user\u角色:2}).all

但你可以做得更好。如果用户在模型中有一个
范围
,您可以这样做

class User
   scope :second_user_role
end


SaleTransaction.joins(:user).merge(user.second_user_role).all

您应该在where子句中指定表名。试一试

SaleTransaction.includes(:user).where(用户:{user\u角色:2}).all

但你可以做得更好。如果用户在模型中有一个
范围
,您可以这样做

class User
   scope :second_user_role
end


SaleTransaction.joins(:user).merge(user.second_user_role).all

我使用了您的查询,但遇到了相同的异常:“ActiveRecord::StatementInvalid:PG::UndefinedTable:错误:表“user”@Tr的子句条目中缺少ầnKimDự 更新了我的帖子谢谢。它很有效。我认为您的解决方案与@Nikita的解决方案类似。但我认为使用哈希语法会更好。例如:
SaleTransaction.joins(:user)。where(users:{user\u role:2})
是的,哈希语法更好,因为我确实使用了您的查询,但我遇到了相同的异常:ActiveRecord::StatementInvalid:PG::UndefinedTable:错误:表“user”@Tr的子句条目中缺少ầnKimDự 更新了我的帖子谢谢。它起作用了。我认为您的解决方案与@Nikita的解决方案类似。但我认为使用哈希语法会更好。例如:
SaleTransaction.joins(:user).where(users:{user\u role:2})
Yes,哈希语法更适用于surethance。有效:D,我从你的帖子中学到了一点:D@TrầnKimDự 这样的查询没有得到优化。它所做的是执行两个查询并获取它们的交集。你不应该使用合并。你只需要使用一个简单的where子句。@AntonTkachov不,它不是。这里是生成的sql
SaleTransaction加载(5.3ms)选择“sale\u transactions”。*从“sale\u transactions”内部加入“users”中的“users”。“id”=“sale\u transactions”。“user\u id”中的“users”。“user\u role”=$1 LIMIT$2[[“user\u role”,“2”],[“LIMIT”,11]
谢谢。有效:D,我从你的帖子中学到了一点:D@TrầnKimDự 这样的查询没有得到优化。它所做的是执行两个查询并获取它们的交集。你不应该使用合并。你只需要使用一个简单的where子句。@AntonTkachov不,它不是。下面是生成的sql
SaleTransaction加载(5.3ms)选择“sale\u transactions”。*从“sale\u transactions”内部加入“users”中的“users”。“id”=“sale\u transactions”。“user\u id”中的“users”。“user\u role”=“1 LIMIT$2[“user\u role”,“2”],[“LIMIT”,11]