【问题标题】:form search by a Users tag_id located in another table通过位于另一个表中的用户 tag_id 进行表单搜索
【发布时间】:2014-04-30 10:37:58
【问题描述】:

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

<%= 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

【问题讨论】:

  • 您使用的是什么版本的 Rails? 4 或之前?
  • 我使用的是 Rails 4.0.0
  • 您想选择同时具有标签 1 和标签 3 的所有用户,还是选择其中任何一个都可以?
  • @KirtiThorat 它是动态的。这取决于应用用户决定点击的复选框。如果用户单击复选框 1 和 3,我希望找到并显示所有具有第一个和第三个标签的用户。如果应用程序用户只点击第二个复选框,我希望显示与第二个标签关联的用户。抱歉,有时很难清楚地表达我想要做什么。
  • 我不认为你有我的问题。如果用户选择 1 和 3,那么您是要显示带有标签 1 和 3 的所有用户(都是必需的)还是要显示带有标签 1 或 3 的所有用户?

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


【解决方案1】:

我的回答可能需要您更改相当多的东西,但是当有一颗宝石可以用来做大部分(如果不是全部)您正在尝试做的事情时,为什么还要为此苦苦挣扎呢?这是 Rails 演员表:http://railscasts.com/episodes/382-tagging?view=asciicast

使用这个宝石:Acts-as-taggable-on

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

我唯一还没有弄清楚的是多个标签,但这应该适合你。

【讨论】:

    【解决方案2】:

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

    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,但我很确定第一个。

    【讨论】:

    • 强参数用于允许可用于创建/更新记录的属性。您不需要它们来触发选择查询。
    • 感谢您的评论,您让我大开眼界 :)。我想知道为什么我有时会收到错误,现在它真的很合乎逻辑!
    • @Oxynum 遵循 at.users = User.where(params.slice(:tag_id)) 我收到此错误:SQLite3::SQLException: no such column: users.tag_id: 谢谢虽然努力:) 非常感谢。
    • 酷我要试试。顺便说一句,我确实必须使用 if/else 语句将我的索引编辑为某些内容,因为原始索引包含所有用户,然后点击搜索会缩小范围,但是当它到达它的工作位置时它应该仍然工作。
    • 我可能在某处搞砸了我的代码。最近的编辑给了我所有的用户,但是当我点击一个复选框并点击搜索时,一切都被删除了。我正在绑定。撬开它看看,因为我认为我们更接近了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2023-03-06
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多