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

belongs_to :product_configurationこれは、 WorkOrdersおよび 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

エラーが発生します。WorkOrders について知りたいと思います。belongs_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

ActiveRecord::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

この問題を解決できました。参加する必要はありませんでしWorkOrdersWorkersnil並べ替えに結合が必要な列を渡すだけです。

  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 に答える