代码之家  ›  专栏  ›  技术社区  ›  Hemanth

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

  •  3
  • Hemanth  · 技术社区  · 14 年前

    我想创建一个模型,其中有一个名为“页面访问”的字段,我希望它保持range作为值,例如:(50。。100) , (1000 .. 5000)等。如何实现这一点??

    3 回复  |  直到 14 年前
        1
  •  7
  •   vonconrad    14 年前

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

    创建列( range_column @my_model_object.range_column = (50..100) . 告诉Rails按如下方式序列化您的范围:

    class MyModel < ActiveRecord::Base
      serialize :range_column
    end
    

    方案2: 创建两列( range_start range_end )类型为“integer”。在模型中设置如下内容:

    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
    

        2
  •  1
  •   Tadas T    14 年前

    我建议创建一个带有pageu-visits属性的模型,该属性包含确切的访问量,并定义实际的方法,如smth

    def page_visit_range
      #case when statement for self.page_visits or some smarter maths to return range
    end
    
        3
  •  0
  •   Blair Anderson    6 年前

    如果您的数据库支持,Rails具有range数据类型。

    下面是一个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