Rails搜索关联

时间:2017-12-08 16:49:17

标签: ruby-on-rails

我正在我的Rails应用程序中创建一个简单的搜索表单,现在它可以让我搜索Pdform属性。 pdform属于用户,因此pdform模型中有user_id

如何搜索用户first_name并让其显示属于他们的所有PDF格式?

这就是我设置它的方式。

路线

get '/pdforms/history', to: 'pdforms#history'

视图

<%= form_tag pdforms_history_path, :method => 'get' do %>
  <%= text_field_tag :search, params[:search] %>
  <%= submit_tag 'Search', :name => nil %>
<% end %>

Pdforms控制器

def history
    @pdforms = Pdform.search(params[:search])
  end

Pdform模型

def self.search(search)
  if search
    self.where("user.first_name like ?", "%#{search}%")
  else
    self.all
  end
end

2 个答案:

答案 0 :(得分:1)

我假设管理员(如评论中所述)应该具有搜索功能,而普通用户应该只能看到自己的Pdforms。

所以,也许你的观点可能包括:

<% if is_admin? %>
  <%= form_tag pdforms_history_path, :method => 'get' do %>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag 'Search', :name => nil %>
  <% end %>  
<% else %>
  <%= link_to 'List', pdforms_history_path %>
<% end %>

然后你的控制器可以做一些事情(从AntonTkachov的答案中大量借用):

def history
  if params[:search] and is_admin?
    @pdforms = self.joins(:user).where("users.first_name LIKE ? OR users.last_name LIKE ?", "%#{search}%", "%#{search}%")
  else
    @pdforms = Pdform.where(user: current_user)
  end
end

注意:整个is_admin?事只是一个例子。你需要确保你确实有这样的方法/助手 - 如果你这样做,我不知道。此外,您应该决定是否要在is_admin?中再次if params[:search] and is_admin?,以确保用户不会使用该网址。

然后你应该有一个views/pdforms/_history.html.erb很好地呈现@pdforms。也许,或许,每个Pdform在一个表的一行上。

答案 1 :(得分:0)

试试这个:

def self.search(search)
  if search
    self.joins(:user).where("users.first_name LIKE ? OR users.last_name LIKE ?", "%#{search}%", "%#{search}%")
  else
    self.all
  end
end