我的模型上有一个复杂的范围,为用户提供符合其参数的有效交易。
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语句搜索序列化列的hack)。然后我将这个数据数组传递给地图! block,它以散列形式呈现所有数据。
这是该块的精简版。 (旁注,我使用rails作为API,这将返回json)
Deal.deal_query(params[:meal].to_i, people).map! {|ld| {
:deal_id => ld.id, :title => ld.title, :description => ld.description}}
在块中,我还试图通过将people列增加1来发送下一个可用交易的名称。我不想在块检查下一个可用交易中运行单独的查询,这将是令人难以置信的缩放时效率低下。
有关如何急切加载下一个可用交易的任何建议都会有所帮助。我想创建另一个范围,只需将people列增加1,但后来我不知道如何将它与第一个范围的数据相匹配。
答案 0 :(得分:0)
为什么不将你的LIKE改为:
where("... (people LIKE '%?%' OR people LIKE '%?%') ...", <etc>, p, p+1, <etc>)
换句话说,一次抓住两个,然后用结果做你需要的。我对map!
调用的目标是什么以及“下一个可用交易的名称”的含义不是很清楚,但是您应该能够从对象中提取所需的任何数据因为你可以使用完整的AR模型。
如果您需要有关可伸缩性的更多帮助,则需要查看数据库架构。从你所展示的内容来看,这种感觉非常难以理解 - 这可能是一种更优雅,更高效的方式来处理人物专栏......