2014-09-05 4 views
-1

У меня есть модель проекта, в которой есть много UserStories. Я хочу, чтобы пользователи могли просматривать их профиль в своих проектах по title, description или UserStory#name. Мне удалось найти title и descripion. Любая помощь в том, как сделать поиск по UserStory#name?Rails search

Это моя форма в views/profile/index:

<%= form_tag "profile/", :method => :get do %> 
    <%= text_field_tag :search %> 
    <%= submit_tag "Search"%> 
<% end %> 

И вот мое index действие в профиле/контроллера:

def index 
    if params[:search]  
    @projects = current_user.projects 
        .where('title LIKE ? or description LIKE ?', 
          "%#{params[:search]}%", "%#{params[:search]}%") 

    current_user.projects.each do |project| 
     if (project.user_stories) 
     project.user_stories.each do |story| 
      if story.name.include? params[:search] 
      @projects << story.project 
      end 
     end 
     end 
    end 

    @projects = @projects.page(params[:page]).per_page(4) 
    else 
    @projects = current_user.projects.order("title") 
        .page(params[:page]).per_page(4) 
    end  
end 
+0

Каким образом это не работает в настоящее время, сообщение об ошибке или просто данные, которые вы используете? – Iceman

+0

Если запись не существует в базе данных, она дает ошибку massege «Действие« show »не может быть найдено для ProfileController», то есть в поиске названия проекта или описания, но в названии истории пользователя, которое оно всегда ищет, t work –

ответ

2

infused имеет право; вы можете сделать это в одном запросе. Вы также можете сделать многое, чтобы упростить код.

def index 
    if params[:search] 
    values = { search: "%#{ params[:search] }%" } 

    conditions = %q{ projects.title   LIKE :search 
        OR projects.description LIKE :search 
        OR user_stories.name LIKE :search } 

    @projects = current_user.projects.joins(:user_stories) 
        .where(conditions, values) 
    else 
    @projects = current_user.projects.order(:title) 
    end  

    @projects = @projects.page(params[:page]).per_page(4) 
end 
+0

Спасибо @jordan и infused. –

0

Вы можете включить другую таблицу в запросе, а затем добавить условия где:

s = "%#{params[:search]}%" 
current_user.projects.includes(:user_stories).where('title LIKE ? OR description LIKE ? OR user_stories.name LIKE ?', s, s, s) 
+0

Это дает ту ошибку SQLite3 :: SQLException: no такой столбец: user_stories.name: SELECT "projects". * FROM "projects" INNER JOIN "project_user_relations" ON "projects". "id" = "project_user_relations". "project_id "WHERE" project_user_relations "." User_id "=? И (название LIKE '% название проекта%' ИЛИ ​​описание LIKE '% название проекта%' ИЛИ ​​user_stories.name LIKE '% название проекта%') ORDER BY title LIMIT 4 OFFSET 0 –