【问题标题】:How to add filtering to find users by City, Gender, Photo and Age?如何添加过滤以按城市、性别、照片和年龄查找用户?
【发布时间】:2013-08-14 17:42:28
【问题描述】:

在我的索引视图中,我希望能够根据城市、性别、照片和年龄过滤用户。目前我只有按年龄过滤。我希望 City 和 Gender 的选项出现在选择列表中,并且照片应该是一个复选框。

这是我的过滤表单:

<form action="/users" method="get">
Ages from: <input id="min_age" name="[min_age]" type="text" class="gteq" />
to <input id="max_age" name="[max_age]" type="text" class="gteq" />
<input class="button" type="submit" value="Filter" />
</form>

这是用户控制器:

def index
@users = User.all
if params[:min_age] && params[:max_age]
@users = @users.where("profiles.birthday >= ? AND profiles.birthday <= ?",
 params[:max_age].to_i.years.ago + 1.day, params[:min_age].to_i.years.ago)
end
end

城市、性别和照片都是 belongs_to 用户的 Profile 模型的属性。每个用户has_one 个人资料。

我希望所有过滤选项都是可选的。我该怎么做?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


    【解决方案1】:

    在 Rails 中,关系可以被链接起来。

    def index
      @users = User.all
      if params[:min_age] && params[:max_age]
        @users = @users.where("profiles.birthday >= ? AND profiles.birthday <= ?",
        params[:max_age].to_i.years.ago + 1.day, params[:min_age].to_i.years.ago)
      end
    
      if params[:city]
        @users = @users.where("profiles.city = ?", params[:city])
      end
    
      if params[:gender]
        @users = @users.where("profiles.gender = ?", params[:gender])
      end
    
      ......
    end
    

    虽然很丑.... 如果你坚持写过滤器,我建议你封装逻辑来建模和使用范围。 或者您可以尝试一个名为ransack 的好宝石。您会发现它已经为您完成了大部分工作,您只需要一点点自定义或不需要。

    【讨论】:

    • 如果所有参数都发送到控制器,输出会是什么?如果我想同时过滤年龄和城市,您的代码在这种情况下将如何工作?另一方面,Ransack 很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多