【发布时间】:2020-02-16 16:55:37
【问题描述】:
目前我有一个表单,用户可以在其中输入每人价格和/或持续时间和/或团队规模。我想要完成的是从表中检索与用户输入匹配的所有记录,为此我在模型中设置范围:
scope :filter_by_team_size, -> (team_size) { where("team_size = ?", team_size) }
scope :filter_by_duration, -> (duration) { where("duration = ?", duration) }
scope :filter_by_price, -> (price) { where("price = ?", price) }
然后在控制器中再次使用它来检索记录:
@experiences = policy_scope(Experience).order(team_size: :desc).geocoded.filter_by_team_size(params[:team_size]) if params[:team_size].present?
@experiences = policy_scope(Experience).order(duration: :desc).geocoded.filter_by_duration(params[:duration]) if params[:duration].present?
@experiences = policy_scope(Experience).order(price: :desc).geocoded.filter_by_price(params[:price]) if params[:price].present?
但是,这只会给我第一个输入值匹配的记录,而忽略所有其他值。此外,当您查看搜索结果并再次使用过滤器时,它应该只对已找到的记录应用过滤器。
任何有关如何解决此问题的建议将不胜感激!
【问题讨论】:
-
您是否尝试过在记录上使用 select 方法?所以如果你有
@experiences,你可以申请@expereinces.select {|e| e.duration == params[:duration]}之类的东西吗?可能会帮助您不断过滤掉事物。 apidock.com/ruby/Array/select -
@RockwellRice 坏主意。这会将所有记录加载到数据库中,如果您有少量记录,这将起作用,但如果您有大量数据,则会非常慢或彻底崩溃服务器。他实际上是在正确的道路上构建范围以过滤数据。
标签: sql ruby-on-rails activerecord