Rails基于两个字段

时间:2015-10-08 12:49:07

标签: ruby-on-rails

我有代码:

 scope :workflow_sort, ->{ has_content.joins(:client).reorder(:clients => :position, :projects => :position) }

通过关联对联接中的两个对象进行排序。 Client是父级,有许多Projects。两者都具有属性position。我正在尝试按Client Position然后project position

对联接进行排序

使用上面的代码时,我会看到屏幕截图中显示的Direction "position" is invalid. Valid directions are: [:asc, :desc, :ASC, :DESC, "asc", "desc", "ASC", "DESC"]。如何对每个位置ASC进行有效的更改?

enter image description here

2 个答案:

答案 0 :(得分:0)

如果您的关系中存在某些现有订单,并且您希望按新订单替换现有订单,则通常使用reorder。 但是,如果您没有在关系上定义任何订单(或范围),则可以使用订单:

scope :workflow_sort, -> { has_content.joins(:client).order('clients.position asc, projects.position asc') }

但是,如果您的关系中有任何预先存在的订单,那么请使用重新排序一次以将当前订单替换为新订单,然后使用更多属性进行更多后续订单链调用:

scope :workflow_sort, -> { has_content.joins(:client).reorder('clients.position asc').order('projects.position asc') }

答案 1 :(得分:0)

根据ActiveRecord QueryMethods

User.order('email DESC').reorder('id ASC').order('name ASC')
     

使用'ORDER BY id ASC,名称ASC'生成查询。

所以在你的情况下它应该是

scope :workflow_sort, -> { has_content
                             .joins(:client)
                             .reorder('clients.position ASC')
                             .order('projects.position ASC') }

scope :workflow_sort, -> { has_content
                             .joins(:client)
                             .reorder(:clients => :position)
                             .order(:projects => :position) }