1

私は配列にシリアル化した「日」属性を含む Meetings クラスを持っています。配列を格納するために使用した方法は、次のとおりです。

Ruby モデルのリンク配列属性

たとえば、次のように実行します。

Meeting.first.days

返される可能性があります:

["Monday", "Tuesday", "Wednesday"]

以下は、Meeting オブジェクト全体の例です。

#<Meeting id: 7, address: "10 Canal Street", neighborhood: "Tribeca", building_name: "Yale Club", name: "Alumni Luncheon", start_time: "00:00", end_time: "00:35", notes: "", days: ["Tuesday", "Wednesday", "Thursday"], zip_code: 10055, special_interest: nil, meeting_type: nil, area: "Manhattan", latitude: 40.8104529, longitude: -73.9922805, created_at: "2013-09-29 22:02:29", updated_at: "2013-09-29 22:02:29">

曜日に対応するチェックボックスを備えた検索フォームがあるため、ユーザーは会議を検索する曜日を確認できます。たとえば、月曜日が含まれる会議を表示したい場合があります。

私の期待は、「日」配列に「月曜日」が含まれる会議オブジェクトが検索で返されることです。しかし、ActiveRecord を使用してこれらの会議をフィルター処理するのに問題があります。これまでのところ、私は持っています:

meetings = Meeting.order(:start_time)
meetings = meetings.where("days in (?)", days_params)

しかし、これは 'meetings' 変数を結果 0 までフィルタリングし続けます。私は間違っている可能性がありますが、問題は「日」が配列でない場合にのみ機能することだと思います。つまり、文字列を配列と比較すると機能する可能性があります。2 つの配列の和集合を比較する必要があるので、だれかアイデアがありますか?

4

2 に答える 2

4

ミーティングにはオブジェクトの配列があるので、select を使用できます。

meetings.select{|i|*compare the days array/check for whatever you want to*}

それはすべきです。日が文字列として保存されている場合は、単一のリクエストで直接解析できます。

meetings = Meeting.where("days like '%Monday%'",days_selected).order(:field_name)
于 2013-09-29T07:54:12.037 に答える
3

私の理解が正しければday、ミーティング テーブルの列は文字列なので%、SQL リクエストで (任意の文字列に一致する)を使用できます。

meetings.where("days LIKE '%?%'", days_params)

days_paramが のような文字列であると仮定すると、 が配列のシリアル化された文字列にある'Monday'かどうかがわかります。Monday

パフォーマンスが心配な場合、これは適切な設計ではありません。この要求は、ミーティング テーブルのフル スキャンを実行して、「Monday」を含むすべての行を検索します。より良い解決策は、Dayモデルとリレーションを作成することですhas_and_belongs_to_many。この方法では、リクエストはmeeting_daysテーブルを使用し、はるかに高速になります (移行でインデックスを作成することを忘れないでください)。

于 2013-09-29T08:05:51.297 に答える