Ruby on rails “如何使用ActiveRecord”;其中;查询以检查两个数组之间的重叠

Ruby on rails “如何使用ActiveRecord”;其中;查询以检查两个数组之间的重叠,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个Meetings类,它包含一个“days”属性,我已将其序列化为一个数组。我用于存储数组的方法如下所述: 链接- 例如,跑步: Meeting.first.days 可能会返回: ["Monday", "Tuesday", "Wednesday"] 以下是整个会议对象的示例: #<Meeting id: 7, address: "10 Canal Street", neighborhood: "Tribeca", building_name: "Yale Club", name

我有一个Meetings类,它包含一个“days”属性,我已将其序列化为一个数组。我用于存储数组的方法如下所述:

链接-

例如,跑步:

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”变量过滤到0结果。我可能是错的,但我认为问题是,只有当“days”不是数组时,这才有效,也就是说,如果我将字符串与数组进行比较,那么它可能有效。因为我需要比较两个数组的并集,有人有想法吗?

既然会议有一个对象数组,您可以使用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)

因为会议有一个对象数组,所以可以使用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)

如果我理解正确,meetings表中的列
day
是一个字符串,因此您可以在SQL请求中使用
%
(匹配任何字符串):

meetings.where("days LIKE '%?%'", days_params)
假设
days\u param
是类似于
'Monday'
的字符串,它将查找
Monday
是否在数组的序列化字符串中


如果您担心性能,那么这不是一个好的设计:此请求会对会议表进行完整扫描,以查找带有“星期一”的所有行。一个更好的解决方案是创建一个
Day
模型,并且关系
具有且属于多个
,这样请求将使用
meeting\u days
表,速度会快得多(不要忘了在迁移中创建索引)。

如果我理解正确,会议表中的
day
列是一个字符串,因此您可以在SQL请求中使用
%
(匹配任何字符串):

meetings.where("days LIKE '%?%'", days_params)
假设
days\u param
是类似于
'Monday'
的字符串,它将查找
Monday
是否在数组的序列化字符串中



如果您担心性能,那么这不是一个好的设计:此请求会对会议表进行完整扫描,以查找带有“星期一”的所有行。一个更好的解决方案是创建一个
Day
模型,并且关系
has_和_属于\u many
,这样请求将使用
meeting_days
表,速度会快得多(不要忘了在迁移中创建索引)。

meetings=meetings.where(“days in(?”,days\u参数),meetings.where,那是模特儿的名字吗?或者只是一个会议对象数组?@0v3rc10ck3d,该代码是否有更改?
meetings=meetings。其中(:days=>days_参数)
@dax no我错误地单击了编辑。未编辑任何内容您使用了序列化数组,这意味着在DB级别它是一个VARCHAR。如果您想对其执行类似于数组的操作,则必须首先在Ruby中对其进行反序列化,否则将其视为字符串。序列化要在这样的逻辑中使用的对象是一种糟糕的设计。meetings=meetings。其中(“days in(?),days_params),是会议。其中,是会议模型名称吗?或者只是一个会议对象数组?@0v3rc10ck3d,该代码是否有更改?
meetings=meetings。其中(:days=>days_参数)
@dax no我错误地单击了编辑。未编辑任何内容您使用了序列化数组,这意味着在DB级别它是一个VARCHAR。如果您想对其执行类似于数组的操作,则必须首先在Ruby中对其进行反序列化,否则将其视为字符串。序列化您想在这样的逻辑中使用的对象是一种糟糕的设计。我认为使用ActiveRecord查询比使用可枚举方法时数据库性能更快,不是吗?顺便说一句,刚刚尝试了这个方法,它确实有效。只是想知道数据库性能问题。我不知道是谁干的。实际上,如果没有更好的结果,我想选择这个作为答案。@agentutah在DB中存储的天数是多少?实际上,这应该通过一个where查询本身来完成,而不是通过活动记录获取数据,然后再对结果执行一些操作。请参见上文。它们被存储为会议实例的一个属性,一个字符串数组。我认为使用ActiveRecord查询比使用可枚举方法时数据库性能更快,不是吗?顺便说一句,刚刚尝试了这个方法,它确实有效。只是想知道数据库性能问题。我不知道是谁干的。实际上,如果没有更好的结果,我想选择这个作为答案。@agentutah在DB中存储的天数是多少?实际上,这应该通过一个where查询本身来完成,而不是通过活动记录获取数据,然后再对结果执行一些操作。请参见上文。它们以字符串数组的形式存储为会议实例的属性。“day”列是字符串数组,而不是字符串本身。换句话说,我将一个数组与另一个数组进行比较,试图找到两者的交点。“day”列是字符串数组,而不是字符串本身。换句话说,我将一个数组与另一个数组进行比较,试图找到两者的交点。