Created_at.1.year.from_now - Rails

Мне нужно создать метод, отображающий дату в таблице на один год позже даты создания. Я пробовал линию, указанную в заголовке, но это не сработало. У меня прямо сейчас есть таблица, в которой рядом с ней указана «дата присоединения», я бы хотел, чтобы она говорила «дата истекла». что будет один год с даты присоединения.

Пример:

class Subscriber < ActiveRecord::Base
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :email, presence: true
  validates :phone_number, presence: true

  def date_joined
   created_at.strftime("%-m/%-d/%-y")
  end

  def expiration_date
   created_at.1.year.from_now
  end
end

Как мне отформатировать этот метод expire_date. date_joined работает нормально.


person Bitwise    schedule 26.04.2016    source источник


Ответы (3)


Помните, что created_at не заполняется до тех пор, пока модель не будет сохранена, ваши расчеты не будут работать до тех пор. Это может быть проблемой.

Метод date_joined, который у вас есть, не должен существовать. Любые проблемы с форматированием должны быть ответственностью вашего представления, поэтому вставьте эту логику вот так:

 <%= model.created_at.strftime("%-m/%-d/%-y") %>

Вы даже можете определить формат для своих дат, используя локали как продемонстрировано в этом вопросе, где вы можете добавить это к config/locales/en.yml:

en:
  date:
    formats:
      default: "%-m/%-d/%-y"
  time:
    formats:
      default: "%-m/%-d/%-y %H:%M"

Затем вы можете использовать это в своем представлении по умолчанию без какой-либо специальной обработки:

<%= model.created_at %>

Это всегда будет форматировать так, как вы хотите, вместо того, чтобы вам приходилось изо всех сил определять специальные методы форматирования для каждой модели, а затем не забывать их вызывать.

Когда дело доходит до вычисления дат в будущем, вы можете выполнять математические операции с датами:

def expiration_date
  (self.created_at || DateTime.now) + 1.year
end

Это будет работать, даже если модель не была сохранена.

person tadman    schedule 26.04.2016

Вы должны добавить 1.year к объекту времени created_at:

def expiration_date
  created_at + 1.year
end

Отформатировано:

def expiration_date
  (created_at + 1.year).strftime("%-m/%-d/%-y")
end

рельсовая консоль:

=> some_object.created_at
=> Wed, 12 Apr 2016 17:37:12 UTC +00:00
=> some_object.created_at + 1.year
=> Wed, 12 Apr 2017 17:37:12 UTC +00:00
=> (some_object.created_at + 1.year).strftime("%-m/%-d/%-y")
=> "4/12/17"
person Зелёный    schedule 26.04.2016
comment
что оба выводят одинаково )) - person 7urkm3n; 27.04.2016
comment
@ 7urkm3n действительно. Исправлена. - person Зелёный; 27.04.2016
comment
Это прекрасно работает, но когда я пытаюсь отформатировать время, это дает мне ошибку. Не могли бы вы показать мне, как отформатировать его так же, как и другой метод, который я перечислил? - person Bitwise; 27.04.2016
comment
def expire_date created_at.strftime(%-m/%-d/%-y) + 1.конец года - person Bitwise; 27.04.2016
comment
Спасибо за вашу помощь! - person Bitwise; 27.04.2016
comment
проще -› .strftime("%m/%d/%y") - person 7urkm3n; 27.04.2016

Я чувствую, что вы на самом деле задаете неправильный вопрос здесь. Вместо того, чтобы делать эту функцию в Rails, вы задаете вопрос Ruby, который звучит так: «Как мне работать с взаимодействием между объектами даты и времени Ruby». Я предлагаю вам взять объекты даты и времени Ruby/Rails и сначала посмотреть, как они работают.

Тем не менее, я почти уверен, что кто-то еще опубликует ответ, который вы хотите увидеть.

person dtc    schedule 26.04.2016
comment
@CameronBass np, получайте удовольствие от ruby/rails! я пока застрял в земле java (лава) :( - person dtc; 27.04.2016