1

我猜相当容易,但不知何故,文档缺少这个(也许是它的简单性)。

我想显示表中的值介于最小值和最大值之间。

我的代码是:

def something
  @foo = Foo.where( :number => ((params[:min])..(params[:max])) )
  respond_to do |format|
    ...
  end
end

难道我做错了什么?

4

4 回答 4

8

您是否检查过您的参数是数字而不是字符串?

@foo = Foo.where(number: (params[:min].to_i)..(params[:max].to_i))

Rails 确实接受范围

# select all where number between 1 and 10
Foo.where number: 1..10

# between 1 and 9
Foo.where number: 1...10
于 2012-12-29T03:36:32.670 回答
1

想想你将如何使用 SQL 来做同样的事情。以下应该工作:

Foo.where("number>?", params[:min]).where("number<?",params[:max])

于 2012-12-29T03:28:39.903 回答
1

你所拥有的应该可以工作,但在这些情况下,我喜欢对进入数据库的内容添加一些控制。通常,我会这样写

def something
  # Make sure something gets set and is an integer
  min = (params[:min] || 0).to_i
  max = (params[:max] || 10).to_i

  # Do some basic range checking so that the query doesn't return every row in the database
  min = 0 if min < 0
  max = 100 if max > 100

  @foo = Foo.where( :number => (min..max) )
  respond_to do |format|
    ...
  end
end

实际上,我刚刚添加的额外代码应该放在 Foo 对象上的一个方法中以获取数据,因为这会使控制器与应该是模型代码的代码混淆。

于 2012-12-29T03:54:24.180 回答
1

find_by_all 方法:

Foo.find_all_by_number(params[:min]..params[:max])

或使用一些 SQL

Foo.where('id in (?)', params[:min]..params[:max])
于 2014-01-11T06:31:39.467 回答