Rails 3: Почему мой атрибут Time неправильно сохраняется в базе данных?

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

У меня есть модель с именем атрибута Time start_date . Когда я создаю новый объект в своем контроллере и инициализирую значение time, объект выглядит созданным правильно, когда я просматриваю его в отладчике…

 (rdb:75) p @tourney
#<Tournament id: nil, created_at: nil, updated_at: nil, start_date: "2011-04-22 20:05:00", duration_in_mins: 30, winners_name: nil>
  

но после того, как он был сохранен в базе данных, start_date значение неверно и устанавливается по умолчанию….

 #<Tournament id: 5, created_at: "2011-04-22 20:07:56", updated_at: "2011-04-22 20:07:56", start_date: "2000-01-01 01:05:00", duration_in_mins: 30, winners_name: nil>
  

Вот мой код контроллера…

 def create

    @tourney = Tournament.new(params[:tournament]) 
    @tourney.start_date = Time.new(params[:date][:year], 
                         params[:date][:month], 
                         params[:date][:day], 
                         params[:date][:hour], 
                         params[:date][:minute])

    debugger
    if @tourney.save 
      redirect_to dashboard_path, :notice => "Tournament Created Successfully"
    else
      redirect_to dashboard_path, :notice => "Tournament Creation Failed"
    end

  end
  

Большое спасибо за вашу мудрость!

Мой код модели…

 # Table name: tournaments
#
#  id               :integer         not null, primary key
#  created_at       :datetime
#  updated_at       :datetime
#  start_date       :time
#  duration_in_mins :integer
#  winners_name     :string(255)
#

class Tournament < ActiveRecord::Base

  has_many :participants, :dependent => :destroy

  attr_accessible :start_date, :duration_in_mins

  validates :start_date, :presence => true

end
  

Комментарии:

1. код модели, как вы просили

2. Спасибо. Вам следует сохранить start_time как datetime поле, если вы хотите также сохранить дату

3. Класс Time также имеет компонент date, ruby-doc.org/core/classes/Time.html

4. В Ruby — да. Но в базе данных — НЕТ. В базе данных хранится только время, но Ruby также возвращает дату, но там нет даты, поэтому дата 01.01.2001

Ответ №1:

ОК. Я понял.

У вас есть

 start_date       :time
  

Но вы должны сохранить его как DateTime. Таким образом, было сохранено только время без даты!

Плюс время было сохранено со смещением по умолчанию ( 0000), а не в вашем местном часовом поясе.

Комментарии:

1. в документах api показано, что класс Time имеет компонент date, ruby-doc.org/core/classes/Time.html

2. база данных не хранит объекты Ruby, но свои собственные типы

Ответ №2:

Три вещи :

1) Кажется, что у вас нигде нет attr_accessible, но имейте в виду, что это может привести к этому.

2) Попробуйте сохранить с помощью save! вместо сохранения. Это явно отобразит возможные ошибки проверки модели. В большинстве случаев, когда модель не сохраняется, это происходит из-за ошибок проверки.

3) В вашем случае я бы также проверил, какое время.new(параметры [: турнир]…. вычисляется, вероятно, с помощью консоли rails.

Комментарии:

1. 1) Я обновил модель, чтобы указать доступные атрибуты, 2) Я попытался использовать save! и 3) вы имели в виду ‘Tournament.new(параметры [: турнир])’? Еще раз спасибо!

2. 3) На самом деле я имею в виду что-то вроде распечатки @tourney.start_date на ваш взгляд, чтобы увидеть, что это действительно действительное время.

Ответ №3:

Вам нужен параметр attr_accessible:start_time в вашей модели?

Комментарии:

1. ну, если у него его нет для какого-либо атрибута, это не может действительно вызвать проблему