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不,它不是。这里是生成的sqlSaleTransaction加载(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不,它不是。下面是生成的sqlSaleTransaction加载(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]