0

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

这是我的过滤器形式:

<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

City、Gender 和 Photo 都是 User 的 Profile 模型的属性belongs_to。每个用户has_one配置文件。

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

4

1 回答 1

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的好宝石。你会发现它已经为你完成了大部分工作,你只需要一点点定制或不需要。

于 2013-08-14T09:42:28.250 回答