Какой лучший способ включить предложение LIKE в запрос Rails, то есть что-то вроде строк (полностью неверно):
Question.where(:content => 'LIKE %farming%')
Какой лучший способ включить предложение LIKE в запрос Rails, то есть что-то вроде строк (полностью неверно):
Question.where(:content => 'LIKE %farming%')
Если это Rails 3, вы можете использовать Arel matches
. Это имеет то преимущество, что агностик базы данных. Например:
Question.where(Question.arel_table[:content].matches("%#{string}%"))
Это несколько неудобно, но легко извлекается в области видимости, например:
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
Конечно, чтобы присоединиться к "И", вы можете просто объединить области.
Изменить: +1 к метаобласти и squeel хотя (не пробовал последний, но это выглядит круто). Оба они добавляют этот тип функциональности и многое другое.
Вы использовали бы синтаксис:
Question.where("content LIKE ?" , "%#{farming}%")
Если вам нужны действительно сексуальные условия и у вас нет проблем с внешними зависимостями, я настоятельно рекомендую MetaWhere и его преемника 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%' }