6

たとえばstart_datelength(日を表す整数として)とを含むイベントがあるとします。

モデルでは、あなたが期待するのと同じくらい簡単に定義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、テーブル内の列として検索しているのに見つからないと想定しているため、サイレントに失敗します。

私はただ愚かであるのか、それともランサックが単にやらせられなかった何かをしようとしているのか?

4

1 に答える 1

10

私がどのようにそれをしたかを見たい人のためだけに:

end_date を定義したモデルで

def end_date
  start_date + length.days
end

次に、:end_date の「ranksacker」メソッドを追加しました

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 + length) と同じ定義でクエリを注文する SQL の一部を作成することです。

テンプレートで次のコードをソート リンクに使用できるようになりました (これにより、Ransacker は ASC/DESC を処理し、wil_paginate などに干渉しなくなります)。

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

そのリンクをクリックすると、次のようなクエリが表示されます。

SELECT DISTINCT events.* FROM events ORDER BY DATE_ADD(events.start_date, INTERVAL events.length DAY) DESC LIMIT 30 OFFSET 0- すべて存在しないテーブルの列で Ransacker によって作成および処理されます!

繰り返しになりますが、簡単な免責事項として、私は PHP のバックグラウンドから来て、Rails と Ruby を約 2 週間学習してきました。 」 私は単に知りません。

于 2013-03-15T14:13:39.733 に答える