我有一个包含"days"属性的Meetings类,我已将其序列化为Array。 我用来存储数组的方法描述如下:
链接 - Ruby 模型的数组属性
例如,运行:
Meeting.first.days
可能会返回:
["Monday", "Tuesday", "Wednesday"]
下面是整个会议对象的示例:
#<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">
我有一个搜索表单,其中包含与一周中的几天相对应的复选框,因此用户可以检查他们想要搜索会议的日期。 例如,用户可能希望查看天数包括星期一的任何会议。
我的期望是搜索返回任何在其"天"数组中包含"星期一"的会议对象。 但是我在使用活动记录过滤这些会议时遇到问题。 到目前为止,我有:
meetings = Meeting.order(:start_time)
meetings = meetings.where("days in (?)", days_params)
但这会不断将"会议"变量过滤到 0 个结果。 我可能是错的,但我认为问题是这仅在"天"不是数组时才有效,即如果我将字符串与数组进行比较,那么它可能会起作用。 既然我需要比较两个数组的联合,有人有想法吗?
由于会议有一个对象数组,您可以使用选择。
meetings.select{|i|*compare the days array/check for whatever you want to*}
这应该可以。如果日期存储为字符串,则可以在单个请求中直接解析。
meetings = Meeting.where("days like '%Monday%'",days_selected).order(:field_name)
如果我理解正确,会议表中day
列是一个字符串,因此您可以在SQL请求中使用%
(匹配任何字符串(:
meetings.where("days LIKE '%?%'", days_params)
假设days_param
是一个像'Monday'
这样的字符串,它将发现Monday
是否在数组的序列化字符串中。
如果您担心性能,这不是一个好的设计:此请求对会议表进行全面扫描,以查找带有"星期一"的所有行。更好的解决方案是创建一个Day
模型和关系has_and_belongs_to_many
,这样请求将使用meeting_days
表并且速度会快得多(不要忘记在迁移中创建索引(。