0

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

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)

Deal.deal_query(params[:meal].to_i, people).map! {|ld| {                                                                                            
:deal_id => ld.id, :title => ld.title, :description => ld.description}}

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

有关如何急切加载下一个可用交易的任何建议都会有所帮助。我考虑过创建另一个范围,只需将 people 列增加 1,但后来我不知道如何将它与第一个范围的数据匹配。

4

1 回答 1

0

为什么不将您的 LIKE 更改为:

where("... (people LIKE '%?%' OR people LIKE '%?%') ...", <etc>, p, p+1, <etc>)

换句话说,一口气抓住两者,然后对结果做你需要做的事情。我不太清楚您的map!通话目标是什么以及“下一个可用交易的名称”是什么意思,但是您应该能够在那时从对象中提取您需要的任何数据拥有完整的 AR 模型。

如果您想在可扩展性方面获得更多帮助,则需要查看 DB 模式。仅从您所展示的内容来看,这感觉非常hacktastic - 可能有一种更优雅和高性能的方式来处理人员列......

于 2013-03-02T01:23:15.807 回答