如何将SQL请求转换为Rails查询
我正试图将SQL转换为Rails查询,但它说:如何将SQL请求转换为Rails查询,sql,ruby-on-rails,postgresql,Sql,Ruby On Rails,Postgresql,我正试图将SQL转换为Rails查询,但它说: Scuttle解析器错误,请检查SQL语法。 很抱歉,我真的不知道如何编写SQL请求。。。所以我不知道我错在哪里。。。 顺便说一句,如果有人知道如何将此作为rails查询编写,我将非常高兴 SELECT users.* FROM orders inner JOIN meals ON orders.meal_id == meals.id inner JOIN users ON users.id = meals.user_id WHERE orde
Scuttle解析器错误,请检查SQL语法。
很抱歉,我真的不知道如何编写SQL请求。。。所以我不知道我错在哪里。。。
顺便说一句,如果有人知道如何将此作为rails查询编写,我将非常高兴
SELECT users.*
FROM orders inner
JOIN meals ON orders.meal_id == meals.id inner
JOIN users ON users.id = meals.user_id
WHERE order.user_id = current_user.id
编辑
也许请求是错误的。。。我的问题与我的工作有关
有人建议我用一个查询对我的用户进行排序
在此应用程序中,用户可以通过order
建议一顿餐
,并点一顿餐
我希望如果一个用户
点了一顿饭
,他可以开始与他购买的用户进行对话
另外,购买了膳食的用户
可以与他购买的用户开始对话
因此,在对话
表中,我有订单id
(很抱歉,它不在图纸上)
易于理解-
不确定Scuttle是否使用连接或不使用别名解析查询
我把它改成了旧的
SELECT users.*
FROM orders, meals, users
where orders.meal_id = meals.id
and users.id = meals.user_id
and orders.user_id = current_user.id;
它给了我
User.select(User.arel_table[Arel.star]).where(
Order.arel_table[:meal_id].eq(Meal.arel_table[:id]).and(
User.arel_table[:id].eq(Meal.arel_table[:user_id]).and(
Order.arel_table[:user_id].eq(CurrentUser.arel_table[:id])
)
)
)
使用Arel助手时
User.select(User[Arel.star]).where(
Order[:meal_id].eq(Meal[:id]).and(
User[:id].eq(Meal[:user_id]).and(Order[:user_id].eq(CurrentUser[:id]))
)
)
Order.select(U[Arel.star]).where(O[:user_id].eq(CurrentUser[:id])).joins(
Order.arel_table.join(Meal.arel_table).on(O[:meal_id].eq(M[:id])).join_sources
).joins(
Order.arel_table.join(User.arel_table).on(U[:id].eq(M[:user_id])).join_sources
)
你的语法
SELECT u.*
FROM orders o
JOIN meals m ON o.meal_id = m.id
JOIN users u ON u.id = m.user_id
WHERE o.user_id = current_user.id ;
给予-
Order.select(U.arel_table[Arel.star]).where(
O.arel_table[:user_id].eq(CurrentUser.arel_table[:id])
).joins(
Order.arel_table.join(Meal.arel_table).on(O.arel_table[:meal_id].eq(M.arel_table[:id])).join_sources
).joins(
Order.arel_table.join(User.arel_table).on(U.arel_table[:id].eq(M.arel_table[:user_id])).join_sources
)
使用Arel助手时
User.select(User[Arel.star]).where(
Order[:meal_id].eq(Meal[:id]).and(
User[:id].eq(Meal[:user_id]).and(Order[:user_id].eq(CurrentUser[:id]))
)
)
Order.select(U[Arel.star]).where(O[:user_id].eq(CurrentUser[:id])).joins(
Order.arel_table.join(Meal.arel_table).on(O[:meal_id].eq(M[:id])).join_sources
).joins(
Order.arel_table.join(User.arel_table).on(U[:id].eq(M[:user_id])).join_sources
)
ps-我永远不会想到使用这个工具,它看起来会为一个非常特定的集合工作,或者可能我使用它的信息太少 为什么您要将内部
写在join
的另一行上?你打算把它当作化名吗?对于编译器来说,这可能不是问题,但是对于维护它的人来说,这是非常混乱的。有一个输入错误:它应该是where orders.user\u id=current\u user.id
@Siyual这是因为这是我第一次尝试编写它…尝试以下方法:user.includes(:orders)。where(orders:{user\u id:current\u user.id})
;此外,这看起来像订单属于:user
,而user有许多:订单。如果是这样,您只需执行current\u user.orders
即可使所有订单的user\u id
等于current\u user.id
@mark-尝试向表中添加别名,不知怎的,这对我很有效。但最终的结果是可怕的。但可能是正确的,那么这可能是这样的吗@users=User.select(User.all.where('order.dine\u id=,dine.id')&('User.id=,dine.User\u id')&('order.User\u id=,current\u User.id'))
我接受了这个答案,因为它帮了我很多忙,但我还没有把它弄糊涂,但我想我已经走了!谢谢:)