由位于另一个表中的用户tag_id进行表单搜索

时间:2014-03-23 02:14:47

标签: ruby-on-rails search checkbox params model-associations

我与用户和标签有很多很多关联。我想根据所选的标签复选框向用户显示。这是我在视图中的搜索表单。

<%= form_tag users_path, :method => 'get' do %>
    <% @tags.each do |tags| %>
      <li><%= check_box_tag "tag_id[]", tags.id %>
          <%= tags.name %>
      </li>
    <% end %>
    <%= submit_tag "Search" %>

  <% end %>

当我点击几个框时,它会将它们存储在“tag_id”中。我的参数看起来像这样:

 params
=> {"utf8"=>"✓",
 "tag_id"=>["1", "3"],
 "commit"=>"Search",
 "action"=>"index",
 "controller"=>"users"}

我不能为我的生活弄清楚如何在控制器中搜索。我需要这样的东西:

def index
#psuedo code -- if searching#
 @users = User.all.where(#all users that have the selected tag_id's associated with the User. In this example, all users with tag_id's 1 and 3)
else
 @tags = Tag.all
 @users = User.all

end

我可怜的尝试:

def index
 binding.pry
 @tags = Tag.all
 @users = User.all.where(self.tags)
 #@users = User.search(params[:search])
end

2 个答案:

答案 0 :(得分:1)

我的回答可能要求你改变一些东西,但是为什么在有宝石的时候会挣扎,你可以用来做你想做的大部分工作(如果不是全部的话)?这是一个Rails演员:http://railscasts.com/episodes/382-tagging?view=asciicast

使用此Gem:Acts-as-taggable-on

https://github.com/mbleigh/acts-as-taggable-on

我唯一没想到的是多个标签,但这应该适合你。

答案 1 :(得分:0)

你认为我的观点很好:) 试试这个:

def index
  @users = User.all(joins: :tags, conditions: {tags: {id: params.slice(:tag_id)}})
end

def index
  @users = User.includes(:tags).where('tags.id IN ?', params[:tag_id])
end

如果第一个不起作用,第二个应该是u_u,但我很确定第一个。