ORDER BY相关模型导轨4

时间:2016-05-11 09:19:15

标签: mysql ruby-on-rails ruby-on-rails-4

我一直在尝试在我的铁路项目的索引视图中添加order_by过滤器。

到目前为止,它已经从过滤器的一些基本顺序中运行良好。

我现在正试图通过附加到我项目的工作人员登录来订购。

class Project < ActiveRecord::Base
  belongs_to :worker, class_name: User, foreign_key: "worker_id"

我在我的模型中使用“范围”来对我的数据进行排序,到目前为止它是我得到的:

  scope :worker_order, -> (order) {joins('LEFT JOIN users ON users.id = projects.worker_id')
    .order('users.login' => order)}

但是我收到了这个错误代码:

  

Mysql2 ::错误:'order子句'中的未知列'projects.users.login':SELECT projects。* FROM projects LEFT JOIN用户ON users.id = projects.worker_id ORDER BY projectsusers.login DESC LIMIT 30 OFFSET 0

我也尝试过其他方法:

  scope :worker_order, -> (order) {joins('LEFT JOIN users ON users.id = projects.worker_id')
.order(:login => order)}

或者:

  scope :worker_order, -> (order) {includes(:worker)
.order('users.login' => order)}

我真的不知道它是否是处理rails中排序的好方法,但它在过滤方面做得很好而且我真的不明白为什么我的过滤器对客户拥有该项目的工作方式有效

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

尝试使用字符串

scope :worker_order, -> (order) { joins('...').order("users.login #{order == 'desc' ? 'desc' : 'asc'}")

order == 'desc' ? 'desc' : 'asc'部分是为了防止SQL注入。如果您确定用户无法操纵order,您可以编写它:

scope :worker_order, -> (order) { joins('...').order("users.login #{order}")