2016-05-11 7 views
0

私はrail_projectのインデックスビューにorder_byフィルタを追加しようとしています。ORDER BY関連モデルレール4

これまでのところ、それはフィルタによっていくつかの基本的な順序からうまく機能しました。

私は現在、自分のプロジェクトに添付されているワーカーログインによって注文しようとしています。

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::Error: Unknown column 'projects.users.login' in 'order clause': SELECT projects .* FROM projects LEFT JOIN users ON users.id = projects.worker_id ORDER BY projects . users.login DESC LIMIT 30 OFFSET 0

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

または:

I'vもそれを行うには他の方法を試してみました:それは、レールでのソートに対処するための良い方法だ場合、私は本当に知りませんが、それは、フィルタリングのためによくやったとすると、このプロジェクトを所有しているクライアント上の私のフィルタが動作する理由を私は本当に得ることはありません

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

ソート方法はありません。あなたの助け

答えて

1

ため

おかげでorder == 'desc' ? 'desc' : 'asc'部分はSQLインジェクションを防ぐためにある文字列

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

で試してみてください。あなたがorderがユーザーによって操作することができないことを確認している場合は、それを書くことができます。

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

こんにちは、あなたの答えのための 感謝を。 私はすでに文字列で試したことがあると思いますが、以前は "projects"を含んでいます。 スコープ:クライアント、 - >(クライアント){distinct.joins( 'LEFT JOIN参加者ON participants.project_id = projects.id') .joins 'LEFT JOIN contact on contacts.id = participants.contact_id')ここで( 'contacts.client_id =?'、client)} 私は今この鉄道を統合しようとしています:http://railscasts.com/episodes/228-sortable-table-columnsをプロジェクトに追加しました。 Thx – galettan

関連する問題