1

我正在尝试为我的应用程序编写一个通用排序库并且遇到了一些问题。我有一个范围定义class WorkOrder,如下所示:

scope :join, lambda {|join_model, sort_direction, sort_by| {:joins => join_model, :order => sort_by + " " + sort_direction}}

join_model作为参数传递给控制器​​,控制器根据传入的参数向模型询问排序列表。够简单...

@work_orders = @order.work_orders.join_to({:product_configuration => :product}, "ASC", "item").all

这非常适用于 WorkOrdersbelongs_to :product_configuration和 ProductConfigurations belongs_to :product

但如果我想这样称呼它:

work_orders = @order.work_orders.join_to("worker", "ASC", "item").all

或者

work_orders = @order.work_orders.join_to(:worker, "ASC", "item").all

我得到一个错误。我确定您想知道 WorkOrdersbelongs_to :worker

因此,总而言之,当我尝试访问时,http://localhost:3000/foo?direction=ASC&join_to=worker&sort=name出现以下错误:

ActiveRecord::StatementInvalid in FooController#index
PG::Error: ERROR:  invalid reference to FROM-clause entry for table "work_orders"
LINE 1: SELECT "work_orders".* FROM "work_orders" worker WHERE (work...

任何建议都将不胜感激,因为我对 Ruby 和 Rails 还很陌生。

更新

如果我将范围定义更改为 scope :join, lambda {|join_model, sort_direction, sort_by| {:joins => join_model.to_sym, :order => sort_by + " " + sort_direction}}

我导航到时没有收到错误消息,http://localhost:3000/foo?direction=ASC&join_to=worker&sort=name但导航到时却收到了http://localhost:3000/pretzel?direction=ASC&join_to%5Bproduct_configuration%5D=product&sort=item

错误信息是

undefined method `to_sym' for {"product_configuration"=>"product"}:ActiveSupport::HashWithIndifferentAccess
4

2 回答 2

0

尝试将此作用域重写为类方法,并使用方法 fromActiveRecord::QueryMethods而不是旧的哈希样式语法。我能够在虚拟应用程序中获得与此类似的东西。

def self.join_to(join_model, sort_column, sort_direction = 'ASC')
  joins(join_model).order("#{sort_column} #{sort_direction}")
end
于 2012-08-17T18:29:59.747 回答
0

我能够解决这个问题。没有必要加入WorkOrdersWorkers。我只是传入nil确实需要对连接进行排序的列。

  def self.join_to(join_model, sort_direction = 'ASC', sort_column)
    if join_model == 'nil'
      order("#{sort_column} #{sort_direction}")
    else
      joins(join_model).order("#{sort_column} #{sort_direction}")
    end
  end 

我只是worker_id通过sort_column

谢谢,肖恩

于 2012-08-17T19:10:53.530 回答