【问题标题】:Rails SQL in controller控制器中的 Rails SQL
【发布时间】:2014-05-29 15:51:43
【问题描述】:

我在 Rails 应用程序中使用 XeditableRABL

我有一个属于workgroupworkorder。 我想将workorder 分配给employee 中的workgroup

我在Xeditable中使用这个作为源:

data-source="/employees.json?workgroup=<%= workorder.workgroup.id%>"

这是我在employee 控制器中尝试的代码:

  def index
    @employees = Employee.order(:first_name)
    @employees = Employee.joins(:empgroups).where(:workgroup_id => params[:workgroup]) if params[:workgroup].present?
  end 

这是生成的 SQL:

SELECT "employees".* FROM "employees" INNER JOIN "empgroups" ON "empgroups"."employee_id" = "employees"."id" WHERE "employees"."workgroup_id" = 2

问题是 WHERE 应该是 `WHERE "empgroups"."workgroup_id" = 2

如何更改这行代码?

@employees = Employee.joins(:empgroups).where(:workgroup_id => params[:workgroup]) if params[:workgroup].present?

感谢您的帮助!

【问题讨论】:

    标签: sql ruby-on-rails x-editable


    【解决方案1】:

    您可以使用嵌套哈希语法:

    @employees = Employee.joins(:empgroups).where(
      empgroups: { workgroup_id: params[:workgroup] }
    ) if params[:workgroup].present?
    

    【讨论】:

    • 在长语句的末尾添加if,尤其是多行语句,会严重降低可读性。最好将语句放在 if 块中。
    【解决方案2】:

    这应该可行:

    Employee.joins(:empgroups).where(:empgroups => {:workgroup_id => params[:workgroup]})
    

    :workgroup_id 实际上是连接表上的属性/列,而不是您要查询的基表上的属性/列,因此您需要在 where 子句中指定该列的位置。

    请记住,在紧要关头,您也可以为 where 子句输入 SQL,但还必须记住正确引用正确的表。

    Employee.joins(:empgroups).where("empgroups.workgroup_id = ?", params[:workgroup])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多