如何在Rails模型创建中使用Range数据类型?

时间:2010-10-16 06:31:08

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

使用Rails版本3。 我想创建一个模型,其中我有一个名为“Page-visits”的字段我希望它将范围保持为值,例如:(50 .. 100),(1000 .. 5000)等。如何实现这一目标? ? 即使目前在rails中没有这样的数据类型,我想知道如何实现这一目标的其他方法?

3 个答案:

答案 0 :(得分:7)

我假设您确实希望在模型中存储范围,而不是范围内的值。 (如果你想做后者,验证将是你的答案)。

所以,范围。在模型中。你有两个选择,每个选项都相当不错。

选项1:创建一个类型为“text”的列(range_column)。将Ruby范围对象传递给列,如@my_model_object.range_column = (50..100)。告诉Rails如下序列化您的范围:

class MyModel < ActiveRecord::Base
  serialize :range_column
end

现在,Rails会自动将您的范围转换为YAML以进行数据库存储,并在再次检索记录时将其转换回范围对象。没有那么容易!

选项2:创建两个类型为“整数”的列(range_startrange_end)。在您的模型中设置如下内容:

class MyModel < ActiveRecord::Base
  def range=(rstart, rend)
    self.range_start = rstart
    self.range_end   = rend
  end

  def range
    (range_start..range_end) # or as an array, or however you want to return it
  end
end

第一个选项更容易(而且,在我看来,更好),而第二个选项让你在开箱即用时更加灵活,以防你不想使用Ruby范围对象(但是,为什么不能不是吗?)。

答案 1 :(得分:1)

我建议使用属性page_visits创建模型,该模型保存准确的访问量并定义实际操作方法,如

def page_visit_range
  #case when statement for self.page_visits or some smarter maths to return range
end

答案 2 :(得分:0)

如果数据库支持,Rails具有范围数据类型。

这是一个PostgreSQL示例:Rails Range Types with PostgreSQL

# db/migrate/20130923065404_create_events.rb
create_table :events do |t|
  t.daterange 'duration'
end

# app/models/event.rb
class Event < ApplicationRecord
end

# Usage
Event.create(duration: Date.new(2014, 2, 11)..Date.new(2014, 2, 12))

event = Event.first
event.duration # => Tue, 11 Feb 2014...Thu, 13 Feb 2014

## All Events on a given date
Event.where("duration @> ?::date", Date.new(2014, 2, 12))

## Working with range bounds
event = Event.
  select("lower(duration) AS starts_at").
  select("upper(duration) AS ends_at").first

event.starts_at # => Tue, 11 Feb 2014
event.ends_at # => Thu, 13 Feb 2014