Каков наилучший способ включить предложение LIKE в запрос Rails? - PullRequest
22 голосов
/ 13 августа 2011

Каков наилучший способ включить предложение LIKE в запрос Rails, то есть что-то вроде (совершенно неверно):

 Question.where(:content => 'LIKE %farming%')

Ответы [ 3 ]

41 голосов
/ 13 августа 2011

Вы бы использовали синтаксис:

Question.where("content LIKE ?" , "%#{farming}%")
33 голосов
/ 13 августа 2011

Если это Rails 3, вы можете использовать matches от Arel.Это имеет то преимущество, что не зависит от базы данных.Например:

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 к мета-локации и сжать хотя (не пробовал последнее, но выглядит круто) Они оба добавляют этот тип функциональности и многое другое.

9 голосов
/ 13 августа 2011

Если вам нужны действительно сексуальные условия и у вас нет проблем с внешними зависимостями, я настоятельно рекомендую 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%' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...