如何将SQL请求转换为Rails查询

时间:2017-06-30 15:02:34

标签: sql ruby-on-rails postgresql

我正在尝试使用此site将SQL转换为Rails查询,但它说:

Scuttle parser error, check your SQL syntax.

我很抱歉,但我真的不知道怎么写SQL请求...所以我不知道我哪里错了... 顺便说一句,如果有人知道如何写这个作为铁路查询我会很高兴

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

修改

也许请求错了...我的问题与我的older post有关 我被建议用查询对用户进行排序......

在此应用中,用户可以推荐meal并订购mealorder

我希望如果user订购了meal,他可以使用他购买的conversation开始user

另外,购买了user的{​​{1}}可以使用他购买的meal开始conversation

所以在user表中我有conversations(抱歉它不在图纸上)。

enter image description here

1 个答案:

答案 0 :(得分:0)

易于理解 - Active Record Guide

不确定,如果Scuttle确实使用连接或不使用别名来解析查询。

  1. 我将其更改为较旧的联接

    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 Helpers

    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]))
      )
    )
    
  2. 您的语法

    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 Helpers

    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
    )
    
  3. ps - 我永远不会想到使用这个工具,看起来它适用于一个非常具体的集合,或者我使用它的信息太少了。