我构建了一个待办事项列表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中。我怎样才能在搜索中提取列表的项目?有两个搜索框似乎很笨拙,即便如此,我也不确定请求路径应该是什么样的。
答案 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