2011-08-13 22 views

Respuesta

31

Si esto es Rails 3 puede usar Arel's matches. Esto tiene la ventaja de ser una base de datos independiente. Por ejemplo:

Question.where(Question.arel_table[:content].matches("%#{string}%")) 

Esto es algo torpe, pero fácilmente extraído para ámbitos, por ejemplo .:

class Question 

    def self.match_scope_condition(col, query) 
    arel_table[col].matches("%#{query}%") 
    end 

    scope :matching, lambda {|*args| 
    col, opts = args.shift, args.extract_options! 
    op = opts[:operator] || :or 
    where args.flatten.map {|query| match_scope_condition(col, query) }.inject(&op) 
    } 

    scope :matching_content, lambda {|*query| 
    matching(:content, *query) 
    } 
end 

Question.matching_content('farming', 'dancing') # farming or dancing 
Question.matching_content('farming', 'dancing', :operator => :and) # farming and dancing 
Question.matching(:other_column, 'farming', 'dancing') # same thing for a different col 

Por supuesto que se unan a "Y" que sólo podría encadenar los ámbitos.

Editar: +1 a metawhere y squeel aunque (no han probado esto último pero parece genial) Ambos agregan este tipo de funcionalidad y mucho más.

+0

Muy bueno, gracias. Sigo leyendo sobre Arel pero nunca descubrí qué era –

+1

Muy genial significa +1 en SO. Gracias por el! – apneadiving

+1

Tus ámbitos son feos como el infierno. Use métodos de clase y mejores listas de argumentos que esto. – Hauleth

36

tendrá que utilizar la sintaxis:

Question.where("content LIKE ?" , "%#{farming}%") 
+0

Gracias por ampliar la pregunta, ¿cómo proporcionaría una serie de condiciones a esa cláusula? –

+4

Puede hacer algo como esto: 'Question.where (" ¿el contenido me gusta? Y el nombre es como? ","% # {Search1}% ","% # {search2}% ")' – Ammar

+0

Gracias - el ¡la respuesta es tan obvia cuando la escribes! –

9

Si quieres condiciones muy atractivas y y no tiene problemas con dependencias externas, le recomiendo MetaWhere y es el sucesor Squeel:

# MetaWhere 
Question.where(:content.like => '%farming%') 

# MetaWhere with operators overloaded 
Question.where(:content =~ '%farming%') 

# Squeel 
Question.where { :content.matches => '%farming%' } 

# Squeel with operators overloaded 
Question.where { :content =~ '%farming%' } 
+0

Gracias - muy útil –

+2

Para squeel, la sintaxis correcta es 'pregunta. donde {content.matches '% farming%'} ' – rwb

Cuestiones relacionadas