【问题标题】:Rails Complex Query Suggesting Next ObjectRails 复杂查询建议下一个对象
【发布时间】:2013-03-01 23:44:06
【问题描述】:

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

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,但后来我不知道如何将它与第一个范围的数据匹配。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord named-scope rails-models


    【解决方案1】:

    为什么不把你的 LIKE 改成:

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

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

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

    【讨论】:

    • 应该注意,你现在的设置方式,你会遇到people LIKE '%10%'匹配人== 10、100、101、10050等的麻烦。如果你坚持这个,我会使用像 : 这样的帖子字符手动序列化您的数据,因此您的数据库内人员列表看起来像“:5:50:280:”,然后将您的喜欢更改为LIKE '%:?:%'(注意保护冒号)
    • 感谢您的回答... people 列永远不会超过 12,所以我应该遇到任何匹配问题。使用“或”调用将有助于急切加载它,但随后我将需要解析返回的数组。地图!调用应该通过每个与约束匹配的对象,我不想通过人 +1 的对象。我只需要它来获取人们 +1 交易的名称。
    • 那么,如何在不选择人员 == 10、11 和 12 的情况下选择人员 == 1? :-) 至于处理结果数组,我同意这是一个问题,但我看不到解决办法。 SQL 没有“下一个”运算符或类似的 - 您唯一的解决方案是为下一个名称进行子选择,这将使您回到对每个项目进行两次选择调用。您能否预先计算“下一个”值并以某种方式将其作为列添加到主要项目中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2023-03-25
    相关资源
    最近更新 更多