Как использовать тип данных Range при создании модели Rails? - PullRequest
3 голосов
/ 16 октября 2010

Я использую Rails версии 3. Я хочу создать модель, в которой у меня есть поле под названием «Посещения страниц». Я хочу, чтобы оно содержало диапазон как значение, например: (50 .. 100), (1000 .. 5000) и т. Д. Как этого добиться? ? Даже если в настоящее время нет таких типов данных в рельсах, я хотел бы знать другие способы, как этого добиться?

Ответы [ 3 ]

7 голосов
/ 16 октября 2010

Я предполагаю, что вы действительно хотите хранить диапазон в вашей модели, а не значение в пределах диапазона. (Если вы хотите сделать последнее, ваш ответ будет подтвержден).

Итак, ассортимент. В модели. У вас есть два варианта, каждый из которых довольно приличный.

Вариант 1: Создать столбец (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 голос
/ 16 октября 2010

Я бы предложил создать модель с атрибутом page_visits, который содержит точное количество посещений и определяет метод в действии, что-то вроде

def page_visit_range
  #case when statement for self.page_visits or some smarter maths to return range
end
0 голосов
/ 12 января 2019

Rails имеет тип данных диапазона, если ваша база данных поддерживает его.

Вот пример postgresql: Типы диапазонов Rails с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...