2015-06-18 5 views
4

Я пытаюсь реализовать функцию пользовательского поиска в моем приложении Rails.Пользовательский поиск в Ruby on Rails

У меня есть 3 таблицы UserCompany и CompanyUser

Мои отношения объявленным являются

class CompanyUser < ActiveRecord::Base 

    belongs_to :company 
    belongs_to :user 
... 
end 

В Company.rb

has_many :company_users, dependent: :destroy 
has_many :users, through: :company_users 

В User.rb

has_many :company_users, dependent: :destroy 
has_many :companies, through: :company_users 

и на моей странице просмотра Я перечисляю все компании, используя таблицу company_users Теперь у меня есть поле поиска, в котором я могу ввести имя, в котором этот список фильтрует этот список пользователей компании.

Я звоню метод из моей таблицы CompanyUsers фильтровать результат поиска как этот

@company_users = CompanyUser.all 
if params[:search_data].present? 
    @company_users = @company_users.filter_company_users(params[:search_data]) 
end 

где PARAMS [: search_data] передается тем же способом, когда данные поиска вводится в поле поиска.

Это метод, который выполняет фильтрацию поиска.

def self.filter_company_users(search_data) 
    where('company_id like (?)', "%#{search_data}%") 
end 

Прямо сейчас я могу получить результат только тогда, когда я ввожу правильный id из CompanyUser таблицы в этом поле поиска. Я пытаюсь выполнить поиск по полям из таблицы пользователя и таблицы компании. Например, email от Пользователя и name от Компании.

+0

Nopes .. Я пробовал это раньше .. Это дает ошибку. –

ответ

3
class CompanyUser 
    def self.search(search_data) 
    search = self.joins(:company, :user) 
    search.where!('company_users.company_id LIKE :query OR users.email LIKE :query OR companies.name LIKE :query', query: "%#{search_data}%") 
    search 
    end 
end 

С join заявлением вы присоединиться к CompanyUser таблице с компанией и пользователем, поэтому вы будете иметь возможность применять фильтры на те таблицы тоже.

Условие, в котором повторно используется одна и та же строка запроса и применяется поиск в OR ко всем столбцам, которые вы хотите найти.

+0

Спасибо! Это помогло .. –

1
@company_users = CompanyUser.all 
@copany_users.all(:conditions => ["company_id LIKE ? OR company.email like ? OR user.name LIKE ?","%#{params[:search_data]}%","%#{params[:search_data]}%", "%#{params[:search_data]}%" ]) 

или

def self.filter_company_users(search_data) 
where("company_id LIKE ? OR company.email like ? OR user.name LIKE ?" ,"%#{search_data}%", "%#{search_data}%","%#{search_data}%") 
end 
+2

Вы не можете запрашивать другие таблицы, если вы не присоедините их к ним. Более того, первый запрос использует очень старую подпись метода 'all', который больше не поддерживается в последних версиях Rails. –

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