列表属于用户时,搜索属于列表的项目

时间:2016-01-28 19:17:22

标签: ruby-on-rails api search serialization

我构建了一个待办事项列表API项目,我需要添加选项来搜索项目和列表。到目前为止,我只能搜索列表。数据也是序列化的(AMS)。

我查询控制器中发生的列表而不是模型。我这样做是为了获得current_user的列表。

这就是我所拥有的:

模型

class User < ActiveRecord::Base
  has_many :lists
  has_many :items, through: :lists
end

class List < ActiveRecord::Base
  belongs_to :user
  has_many :items, dependent: :destroy 
end

class Item < ActiveRecord::Base
  belongs_to :list
end 

控制器

class Api::ListsController < ApiController
  before_action :authenticated?

  def index
    if params[:name].present?
      lists = current_user.lists.where('name LIKE ?', "%#{params[:name]}%")
    else
      lists = current_user.lists
    end
      render json: lists
  end
end

串行器

class UserSerializer < ActiveModel::Serializer
  attributes :id, :username

  has_many :lists
end

class ListSerializer < ActiveModel::Serializer
  attributes :id, :name, :permissions, :user_id

  has_many :items 
end

class ItemSerializer < ActiveModel::Serializer
  attributes :list_id, :id, :name, :complete 
end

由于我已经构建了一个前端,因此列表和项目显示在welcome #index中。在同一页面上,我添加了一个简单的表单来执行搜索:

  <%= form_tag api_lists_path, :method => 'get', :id => "api_lists_search" do %>
    <p>
      <%= text_field_tag :name, params[:name] %>
      <%= submit_tag "Search", :name => nil %>
    </p>
  <% end %>

目前,执行搜索会执行正确的请求,然后转到GET / api / lists?name = shopping,然后显示在json中。我怎样才能在搜索中提取列表的项目?有两个搜索框似乎很笨拙,即便如此,我也不确定请求路径应该是什么样的。

3 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

class Api::ListsController < ApiController
  before_action :authenticated?

  def index
    if params[:name].present?
      lists = current_user.lists.where('name LIKE ?', "%#{params[:name]}%")
      items = current_user.items.where('name LIKE ?', "%#{params[:name]}%")
    else
      lists = current_user.lists
    end

      results = items.any? ? lists + items : lists  

      render json: results
  end
end

答案 1 :(得分:0)

首先,要将用户列表的查询移动到模型,您可以在用户模型中创建类方法,如;

class User < ActiveRecord::Base
  has_many :lists
  has_many :items, through: :lists

  def self.find_list(name)
    self.lists.where('name LIKE ?', "%#{name}%")
  end
end

并使用;

从控制器调用此方法
class Api::ListsController < ApiController
  before_action :authenticated?

  def index
    lists = current_user.lists
    lists = current_user.find_list(params[:name]) if params[:name].present?
    render json: lists
  end
end

然后,您可以在视图中添加一个下拉列表,以选择是否搜索列表或项目,在项目的用户模型中创建方法,并在控制器中检查下拉列表的值并调用相应的方法

答案 2 :(得分:0)

我可以通过将索引操作更改为:

来搜索我的项目(以及我的列表)
class Api::ListsController < ApiController
  before_action :authenticated?

  def index
    if params[:name].present?
      lists = current_user.lists.joins(:items).where(
        'lower(lists.name) LIKE ? or lower(items.name) LIKE ?', 
        "%#{params[:name].downcase}%",
        "%#{params[:name].downcase}%"
        )
    else
      lists = current_user.lists
    end
      render json: lists
  end
end