【发布时间】:2012-06-05 15:12:53
【问题描述】:
我正在使用 Ruby on Rails 3.2.2,我想通过“指定”/“过滤”这些关联对象的属性值来检索/限定关联对象。也就是此时我使用的是如下代码:
class Article < ActiveRecord::Base
def self.search_by_title(search)
where('articles.title LIKE ?', "%#{search}%")
end
end
class ArticleAssociation < ActiveRecord::Base
def self.search_by_article_title(search)
joins(:article).where('articles.title LIKE ?', "%#{search}%")
end
end
在上面的代码中,where('articles.title LIKE ?', "%#{search}%") 子句重复了两次,所以我认为可以通过 DRY 原则对其进行改进:是否可以直接使用Article.search_by_title 方法在ArticleAssociation.search_by_article_title方法中?
典型的用例是:
ArticleAssociation.search_by_article_title("Sample string")Article.search_by_title("Sample string")
【问题讨论】:
-
我在一个项目(4 个相关模型)中遇到了同样的情况,我创建了一个模块来保存常见的搜索方法。 Ut 并不完全符合您的要求,但它是一个典型的解决方案。
-
类之间共享的代码通常在一个模块中结束
-
顺便说一句,squeel 的 sifters 可以用来做这个,但是使用 squeel 代替 AR 是一个很大的变化。github.com/ernie/squeel#sifters
-
@tokland - 你能提供一个在模块中实现的示例吗?
-
@apneadiving:并非总是如此。在这种情况下,我们有两个(似乎是)相关的类,只是碰巧没有继承关系。当它在某些类之间共享并且对于这些类特定时,我会将它放在类中。特定的数据库查询字符串是否值得拥有自己的模块?
标签: ruby-on-rails ruby ruby-on-rails-3 refactoring dry