4

Я использую акты-а-taggable-на драгоценный каменьRails добавить две рамки с активным рекордным результатом

я использовать одно поле для поиска по tag_name и user_name

User.rb

class User < ActiveRecord::Base 

    acts_as_taggable 
    attr_accessor: :user_name, :age, :country, tag_list 
    scope :tagged_with, lambda { |tag| 
    { 
     :joins => "INNER JOIN taggings ON taggings.taggable_id = user.id\ 
       INNER JOIN tags ON tags.id = taggings.tag_id AND taggings.taggable_type = 'User'", 
     :conditions => ["tags.name = ?", tag], 
     :order => 'id ASC' 
    } 
    } 
    def self.search(search) 
    if search 
     where('name LIKE ?', "%#{search}%") + tagged_with(search) 
    else 
     scoped 
    end 
    end 
end 

Но у меня проблема с разбивкой по страницам, когда я получаю это как Array, и я использовал «will_paginate/Array» в config/initializer/will_paginate.rb, это не работает.

Контроллер пользователя

class UserController < ActionController::Base 
    def index 
    @users = User.search(params[:search]).paginate(:per_page => per_page, :page => params[:page]) 
    end 

консоли.

User.search ("best") => Должен искать как тег_имя, так и имя_пользователя и возвращать результат ActiveRecord.

я хочу, чтобы получить результат User.search («лучший») союз с результатом имени тега User.tagged_with («лучший»)

Можете ли вы помочь мне, чтобы добавить этот прицелы, как ActiveRecord связи использовать разбиение на страницы без проблем.

+1

Я думаю, что ваша сфера может быть переписана: 'Область применения: tagged_with, лямбда {| тег | joins (: tags) .where (tags: {name: tag}). order ('users.id ASC')}) ' – MrYoshiji

ответ

3

Я думаю, вам просто нужно вернуть змеевидный объем (используйте . вместо +):

where('name LIKE ?', "%#{search}%").tagged_with(search) 

Он возвращает ActiveRecord::Relation вместо Array.

Если вам необходимо выполнить операцию UNION, я рекомендую вам следить за этой темой: ActiveRecord Query Union.

Один из возможных подходов заключается в расширении ActiveRecord:

module ActiveRecord::UnionScope 
    def self.included(base) 
    base.send(:extend, ClassMethods) 
    end 

    module ClassMethods 
    def union_scope(*scopes) 
     id_column = "#{table_name}.id" 
     sub_query = scopes.map { |s| s.select(id_column).to_sql }.join(" UNION ") 
     where("#{id_column} IN (#{sub_query})") 
    end 
    end 
end 

Использование (не проверено):

class User < ActiveRecord::Base 
    include ActiveRecord::UnionScope 

    def self.search(search) 
    if search 
     union_scope(where('name LIKE ?', "%#{search}%"), tagged_with(search)) 
    else 
     scoped 
    end 
    end 
end 
+0

Спасибо за ответ. Я хочу получить результат User.search («best») union с результатом имени тега User.tagged_with («best»). – Mano

+0

Спасибо за ответ. Он отлично работает с моей консоли. Теперь я получаю эту ошибку http://stackoverflow.com/questions/33281995/mysql2-lost-connection-to-mysql-server-during-query. Незлая помощь. – Mano

 Смежные вопросы

  • Нет связанных вопросов^_^