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