2013-03-07 21 views
6

たとえば、私はstart_datelength(日を表す整数として)というイベントがあります。Rails&Ransack - モデル内の定義に基づいて並べ替え/検索する

私はend_dateあなたが期待する非常に単純としてstart_date + length.daysように定義するモデルで:

def end_date 
    start_date + length.days 
end 

すべてがテンプレートで正常に動作し、私は開始日を表示するためにevent.end_dateを使用することができますプラスしかし、多くの日数の長さをに設定しました、の場合は、Ransackを使用して終了日までにイベントを注文したいと考えています。

start_dateの並べ替えのリンクは次のようになります。<%= sort_link @q, :start_date, "Start" %>

私はEND_DATE(<%= sort_link @q, :end_date, "End" %>)のために同じことをしようとした場合、私はそれが表に列としてend_dateを探して、それを見つけていない推測として、それは残念ながら静かに失敗しました。

私は単に愚かであるか、何かをしようとしていますか?単にRansackはやらなかったのですか?ただ、私はそれをやった方法を見たい人の利益のために

+0

ransackは検索パラメータをActiveRecord ORM上のクエリに変換するように見えます。これは、基礎となるDBが検索できる実際の列がない限り間違いなく失敗します。 – bdares

+0

コメントありがとう@bdares。私はモデルの 'ransacker:end do | r |'を 'Arel :: Nodes :: SqlLiteral.new(" DATE_ADD(events.start_date、INTERVAL events.length DAY) ")'に設定することができました。クエリを生成する: 'SELECT DISTINCT events。* FROM events DATE_ADD(events.start_date、INTERVAL events.length DAY)DESC LIMIT 30 OFFSET 0'。それはうまくいくが、ひどく「ハッキー」と感じる。 – bensmithbwd

+0

@bensmithbwd - あなたのコメントの完全な解決策を見るのは難しいです。完全な例を書くために気をつけて、解決策をよりよく理解できるようにしてください。その後、あなた自身の答えを受け入れることができます。 –

答えて

10

私は、その後は「ranksacker」メソッドを追加しました私はEND_DATE

def end_date 
    start_date + length.days 
end 

を定義したモデルで:END_DATE

ransacker :end_date do |r| 
    Arel::Nodes::SqlLiteral.new("DATE_ADD(`events`.`start_date`, INTERVAL `events`.`length` DAY)") 
end 

これは上記の句を実行するのに最適かどうかはわかりませんが、私はRuby/RailsよりもSQLをよく知っています。

何それが効果的に行いますがEND_DATE(START_DATE +長さ)と同じ定義でクエリを順序付けSQLの作品を作成することです

私は今、テンプレートでソートリンクについては、次のコードを使用することができます(可能になりますRansacker wil_paginateなどなどに干渉ASC/DESCを処理しないためには):

:あなたがそのリンクをクリックすると

<%= sort_link @q, :end_date, "Event End Date" %>

あなたの線に沿ってクエリを取得します- Ransackerによって作成され、テーブル内の列にも存在しない列が作成されます。

また、迅速な免責事項、私は約2週間、PHPの背景から来ているので、私は熟練者ではありません、これはひどく非効率的であるか、私が単に知らないより良い「道の道」です。

関連する問題