Ruby on rails Rails复杂查询建议下一个对象

Ruby on rails Rails复杂查询建议下一个对象,ruby-on-rails,ruby-on-rails-3,activerecord,named-scope,rails-models,Ruby On Rails,Ruby On Rails 3,Activerecord,Named Scope,Rails Models,我的模型上有一个复杂的范围,为用户提供满足其参数的活动交易 scope :deal_query, lambda { |m, p| where("meal = ? and active = ? and people LIKE '%?%' and inactive_days NOT LIKE '%?%'", m, true, p, Time.zone.now.wday)} people列被序列化并存储一个数字数组(使用LIKE-sql语句搜索序列化列是一种恶作剧)。然后我将这个数据数组传递给一个地

我的模型上有一个复杂的范围,为用户提供满足其参数的活动交易

scope :deal_query, lambda { |m, p| where("meal = ? and active = ? and people LIKE '%?%' and inactive_days NOT LIKE '%?%'", m, true, p, Time.zone.now.wday)}
people列被序列化并存储一个数字数组(使用LIKE-sql语句搜索序列化列是一种恶作剧)。然后我将这个数据数组传递给一个地图!块,它以哈希形式呈现所有数据

这是一个精简版本的块。(旁注,我使用rails作为API,这将返回json)

在这个块中,我还试图通过将people列增加1来发送下一个可用交易的名称。我不想在块检查中为下一个可用的交易运行单独的查询,这将是非常低效的


任何关于如何快速加载下一个可用交易的建议都会有所帮助。我想创建另一个范围,只需将people列增加1,但我不知道如何将其与第一个范围中的数据进行匹配

为什么不将您的喜好更改为:

where("... (people LIKE '%?%' OR people LIKE '%?%') ...", <etc>, p, p+1, <etc>)
其中(“…(人们喜欢“%”或“%”之类的人)…”,p,p+1,)
换句话说,一次抓住两个,然后根据结果做你需要做的事情。我不太清楚你的
地图的目标是什么调用以及“下一笔可用交易的名称”的含义,但此时您应该能够从对象中提取所需的任何数据,因为您将拥有完整的AR模型


如果您想要更多关于可伸缩性的帮助,则需要查看DB模式。从你所展示的内容来看,这感觉相当骇人听闻-可能有一种更优雅、更高效的方式来处理人物专栏…

应该注意,你现在的设置方式,你会遇到像“%10%”这样的
人的麻烦。
匹配人物==101001050,等等。如果你坚持这样,我会使用如下post字符手动序列化您的数据:,这样您的in-db人员列表将显示为“:5:50:280:”,然后将您的like更改为“%”:?:%”之类的
(注意冒号)谢谢您的回答。。。人物栏永远不会超过12,所以我会遇到任何匹配问题。使用'OR'调用将有助于快速加载它,但随后我需要解析返回的数组。地图!调用应该遍历与约束匹配的每个对象,我不想遍历带有people+1的对象。我只需要它来获取people+1交易的名称。那么,您如何选择people==1而不选择people==10、11和12呢?:-)至于处理结果数组,我同意这是一个问题,但我看不到解决方法。SQL没有“next”运算符或类似的运算符-您唯一的解决方案是对下一个名称进行子选择,这将使您返回到对每个项有两个select调用的状态。您能否预先计算“下一个”值,并以某种方式将其作为列添加到主项中?
where("... (people LIKE '%?%' OR people LIKE '%?%') ...", <etc>, p, p+1, <etc>)