如何使用 ActiveRecord "where" 查询来检查两个数组之间的重叠



我有一个包含"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表并且速度会快得多(不要忘记在迁移中创建索引(。

最新更新