1

我有一个会议类,其中包含一个“天”属性,我已将其序列化为一个数组。这里描述了我用来存储数组的方法:

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)

但这会不断将“会议”变量过滤为 0 个结果。我可能是错的,但我认为问题在于,这仅在“days”不是数组时才有效,即如果我将字符串与数组进行比较,那么它可能会起作用。由于我需要比较两个数组的并集,有人知道吗?

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在数组的序列化字符串中。

如果您关心性能,这不是一个好的设计:此请求对会议表进行全面扫描以查找所有带有“星期一”的行。更好的解决方案是创建一个Day模型和关系has_and_belongs_to_many,这样请求将使用meeting_days表并且会更快(不要忘记在迁移中创建索引)。

于 2013-09-29T08:05:51.297 回答