модели поиска tagged_with ИЛИ title like (with act_as_taggable_on)

Я делаю поиск по модели, используя прицел. Доступ к нему осуществляется с помощью формы поиска с параметром поиска q. В настоящее время у меня есть приведенный ниже код, который отлично работает для поиска по тегам, связанным с моделью. Но я также хотел бы выполнить поиск в поле заголовка. Если я добавлю к этой области, я получу все результаты, где есть тег и заголовок, соответствующие поисковому запросу.

Однако мне нужно вернуть результаты, которые соответствуют company_id и category_id и/или соответствующему заголовку или тегу. Я застрял в том, как добавить предложение OR в эту область.

  def self.get_all_products(company, category = nil, subcategory = nil, q = nil)
    scope = scoped{}
    scope = scope.where "company_id = ?", company
    scope = scope.where "category_id = ?", category unless category.blank?
    scope = scope.tagged_with(q) unless q.blank?
    scope
  end

Я использую Рельсы 3.


person robzolkos    schedule 21.02.2011    source источник
comment
Можете ли вы объяснить, что вы в конечном итоге сделали. Я также использую «действия как пометки» и хочу, чтобы запрос возвращал результаты, соответствующие либо названию компании, либо любым тегам, связанным с записью.   -  person you786    schedule 17.04.2012


Ответы (2)


Вы когда-нибудь думали об Ареле? Вы можете сделать что-то вроде этого

t = TableName.arel_table
scope = scope.where(t[:title].eq("BLAH BLAH").or(t[:tag].eq("blah blah")))

или еще вы можете сделать

scope = scope.where("title = ? OR tag = ", title_value, tag_value)
person bokor    schedule 21.04.2011
comment
Это не работает, поскольку теги хранятся в отдельной таблице и фактически не принадлежат таблице, которую OP хочет запросить. - person Noz; 12.07.2012
comment
да, не должно быть принято. Вопрос касается act_as_taggable, и это не работает… или я что-то упустил? - person Ben; 29.11.2014

Я могу ошибаться, но я не думаю, что области могут помочь вам построить условие or. Вместо этого вам придется вручную написать код для создания предложения where. Может быть, что-то вроде этого...

clause = "company_id=?"
qparams = [company]

unless category.blank?
    clause += " or category_id=?"
    qparams <= category
end

scope.where clause, *qparams
person Steve Jorgensen    schedule 21.02.2011
comment
хм... думал, что может быть более простой способ сделать это. Спасибо за Ваш ответ :) - person robzolkos; 21.02.2011