在Rails应用程序中,模型搜索逻辑应该放在哪里?

7
我正在尝试找出在Rails应用程序中放置多属性搜索表单逻辑的“最佳”位置。所涉及的搜索表单具有多个属性,这些属性可能具有值,也可能没有值,并且属性之间的数据类型不同。 (例如,有搜索选项可搜索价格属性在两个数字之间,日期范围,字符串值等的项目。)此外,所涉及的模型通过has_a/has_many关系具有几个嵌套属性,其中一些属性也需要进行搜索。
Rails的口号是“厚模型,薄控制器”,这使我不愿将搜索逻辑聚合到控制器中。但是,将与构造搜索条件相关的逻辑放入模型中似乎也不合适。最后,在DRY的精神下,我不愿将大量特定属性名称硬编码到某个模块中,因为我需要将类似的搜索逻辑应用于几个不相关的模型。也许可以使用搜索视图中表单字段的命名约定来构建正确的条件? (类似于使用前缀“min_”,“max_”,“startdate_”指示数据类型和搜索条件运算符,后缀是模型和/或属性的名称?)
我已经搜索了关于此的建议,但大多数建议似乎都不灵活(硬编码属性名称,不支持嵌套属性),或者使用基于路由的搜索,我认为这对我的需求不起作用(其中可能会在一次搜索中使用5-10个参数)。
有关“Rails方式”做到这一点的建议吗?

1
很好的问题。像这样有趣的Rails问题在SO上很少会引起太多关注。但是如果它们被注意到,你可能会得到一些很好的答案。看看我的问题,这里https://dev59.com/wXNA5IYBdhLWcg3wKacx,实际上是相关的(某种程度上)。顺便说一句,你使用属性名称的想法不错,似乎是Railsy的做法。 - Dan Rosenstark
1
Yar,谢谢你提供的链接。你在那里的评论对我确实很有用 - 我也在思考一旦找到如何做到这一点,最终将搜索逻辑放在哪里。在发布问题后,我还发现了一个关于Rails搜索的演示文稿:http://www.scribd.com/doc/3188387/Advanced-Searching-in-Rails。我认为那里提出的方法结合Dave在下面的建议和你关于组织不符合MVC范例的代码的建议将构成我的解决方案的基础。谢谢! - Chris Hart
当然,@Chris Hart,祝你好运。 - Dan Rosenstark
1个回答

1
如果你使用的是2.3.x版本,我一直发现Searchlogic是一个坚实而灵活的起点,用于搜索不需要全文检索的ActiveRecord模型。它支持关联、命名作用域等。
如果你在使用Rails 3,meta_search gem似乎提供了类似的功能,但我的经验极为有限。

2
我不认为这是一个关于可以放哪个gem的问题。这是一个关于如何在Rails应用程序中组织自己的代码的相关问题。 - npiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接