1

ビジネスとタイムスロットの2つのモデルがあり、その関係はそれであるとしましょうbusiness has_many :timeslots'Monday', 'Tuesday'各タイムスロットには、などの曜日名を格納する日列があります。

私がする時

bussiness.time_slots

ソートされていないタイムスロットが表示されます。タイムスロットを(アルファベット順ではなく)曜日名で並べ替えたい。「月曜日」のタイムスロットは「火曜日」よりも最初に来ます。

並べ替えはカスタムであるため、SQLはこれを支援できないと思います。読んだ後に並べ替える必要がありますが、どのコードをどこに配置するかが心配です。

私は次のようなことができます

私のコントローラーで

b = current_business
TimeSlot.find_sorted_with_busines(b)

私のTimeSlotモデルで

def find_sorted_with_business(b)
   b.time_slots
   # sort timeslots using custom sorting here and return
end

しかし、ビジネスオブジェクトまたはIDをTimeSlotモデルに渡すというアイデアは好きではありません。次のようなことができるはずです。

b = current_business
b.sorted_timeslots

これどうやってするの ?

曜日名に基づいてカスタムソートを行う方法についてのアイデアも歓迎します:)

ありがとう

4

2 に答える 2

2

曜日名の代わりに整数をデータベースに格納することを検討する必要があります。並べ替えが簡単になり、おそらくもう少しパフォーマンスが向上します。

次に、daygetter(整数から曜日名を返す)とsetter(曜日名に対応する整数を格納する)をオーバーライドできます。フォームから取得する内容によっては、セッターをオーバーライドする必要がない場合があります。

整数が1から7の間であるかどうかを確認するために、カスタム検証を行うことを忘れないでください。

于 2012-07-05T18:55:54.847 に答える
1

SQLを使用してカスタムソートを実行できます。

SELECT *
FROM my_table
ORDER BY CASE 
        WHEN dayname = 'Monday' THEN 1
        WHEN dayname = 'Tuesday' THEN 2
        .
        .
        WHEN dayname = 'Sunday' THEN 7
        ELSE 8
     END

ただし、ロビンが提案するような列タイプにはintだけを使用し、数値を使用して曜日の名前を取得すると、順序が簡単になります。

于 2012-07-03T19:19:32.803 に答える