处理索引页上多个可能的查询条件的最佳方法
我有一个存储用户创建的文档的应用程序。 这些文档有作者、创建日期。 作者可以有角色。 此外,给定的文档可能会被标记为关键字。 数据库中有约 16K 文档,用户可能希望查看具有此信息的任意组合的文档作为限制。 例如,查看给定作者的所有文档,或在给定时间窗口内发布的所有文档,或来自该角色的作者的所有文档等(以及这些的任意组合)。
有推荐的最佳方法来实现这一点吗? 一般来说,我已经在参数哈希中传递了所需的条件,然后使用复杂的 if ... elsif .... else .. 将传递的条件直接解码为不同的 Model.find 调用。 或者,我将使用类似的 if 序列来构造正确的 SQL 条件短语,然后使用单个 find 调用。
这两个看起来都像是黑客,应该有更好的方法来使用命名范围来做到这一点,但我无法找到一种干净的方法来处理排列。
I have a application which stores documents created by users. These documents have authors, creation dates. The authors can have roles. Additionally a given document may get tagged with keywords. There are ~16K documents in the database, and a user may want to view the documents with any combination of this information as a limit. For example, see all documents by a given author, or published in a given time window, or from authors in this role, etc (and any combination of these).
Is there a recommended best way to implement this? In general I have passed the desired conditions in the params hash and then either used a complicated if ... elsif.... else.. to decode the passed conditions directly into different Model.find calls. Alternatively, I will use a similar if sequence to construct the proper SQL conditions phrase and then use a single find call.
Both of these seem like hacks and there should be a better way to do it with named scopes, but I can't figure out a clean way to deal with the permutations.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看看 Ben Johnson 的 SearchLogic——它是一个基本上可以动态生成命名范围的宝石。
http://github.com/binarylogic/searchlogic/tree/master
Check out Ben Johnson's SearchLogic -- it's a gem that basically generates named scopes on the fly.
http://github.com/binarylogic/searchlogic/tree/master
您只需要使用
Model.find
编写一行代码。 使用条件逻辑来填充传递到find
调用中的:conditions
哈希,而不是使用条件逻辑创建多个find
调用。You only need to have one line of code with
Model.find
. Instead of using conditional logic to create multiplefind
calls use conditional logic to populate the:conditions
hash which is passed into thefind
call.