Estoy usando Ruby on Rails 3.2.2 y me gustaría recuperar/objetos asociados al alcance "especificando"/"filtrando" un valor de atributo en esos objetos asociados. Es decir, en este momento estoy usando el siguiente código:¿Cómo SECAR los métodos de alcance utilizados en dos clases diferentes?
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
En el código anterior la cláusula where('articles.title LIKE ?', "%#{search}%")
se repite dos veces y así que pensé que puede ser mejorada con el principio DRY: es posible utilizar elArticle.search_by_title
método directamente en elArticleAssociation.search_by_article_title
método?
casos de uso típicos son:
ArticleAssociation.search_by_article_title("Sample string")
Article.search_by_title("Sample string")
Me enfrenté a esta misma situación en un proyecto (4 modelos relacionados) y creé un módulo para contener los métodos de búsqueda comunes. No es exactamente lo que pides, pero es una solución típica. – tokland
El código compartido entre clases generalmente termina en un módulo – apneadiving
por cierto, los tamices de squeel se pueden usar para esto, pero usar squeel en lugar de AR es un gran cambio. Https://github.com/ernie/squeel#sifters – tokland