Атрибуты объекта Rails не сохраняются

Я относительно новичок в Rails (4, Ruby 2.0), и в настоящее время у меня есть ассоциация has_many + own_to, с которой я работаю. Ассоциация, которую я пытаюсь смоделировать, - это «День», имеющий несколько «Временных интервалов», и каждый временной интервал принадлежит Дню.

Мои модели выглядят так:

День.рб

class Day < ActiveRecord::Base
  has_many :timeslots
  belongs_to :calendar
end

Таймслот.rb

class Timeslot < ActiveRecord::Base
  has_many :events
  belongs_to :day
  validates_presence_of :start_time
  validates_presence_of :end_time
  validates_presence_of :day_id
end

Схемы для дня и временного интервала:

  create_table "days", force: true do |t| 
    t.datetime "created_at"
    t.datetime "updated_at"
  end 

  create_table "timeslots", force: true do |t| 
    t.datetime "created_at"
    t.datetime "updated_at"
    t.time     "start_time"
    t.time     "end_time"
    t.integer  "day_id"
  end

Проблема, которую я вижу, заключается в том, что я не могу правильно сохранить объект временного интервала в БД:

В консоли:

d = Day.new
=> #<Day id: nil, created_at: nil, updated_at: nil, date: nil> 
d.id = 20140322
=> 20140322 
d.save
(0.1ms)  begin transaction
SQL (22.2ms)  INSERT INTO "days" ("created_at", "date", "id", "updated_at") VALUES (?, ?,     ?, ?)  [["created_at", Sat, 22 Mar 2014 21:28:27 PDT -07:00], ["id", 20140322], ["updated_at", Sat, 22 Mar 2014 21:28:27 PDT -07:00]]
 (6.8ms)  commit transaction
 => true

 Day.all
 Day Load (0.3ms)  SELECT "days".* FROM "days"
 => #<ActiveRecord::Relation [#<Day id: 20140322, created_at: nil, updated_at: nil>]> 
 t = Timeslot.new
 => #<Timeslot id: nil, created_at: nil, updated_at: nil, start_time: nil, end_time: nil, day_id: nil> 
 t.start_time = Time.now
 2014-03-22 21:28:52 -0700 
 t.end_time = Time.now
 2014-03-22 21:28:57 -0700 
 t.day_id = 20140322
 => 20140322 
 t.save
(0.1ms)  begin transaction
SQL (0.8ms)  INSERT INTO "timeslots" ("created_at", "day_id", "end_time", "start_time",  "updated_at") VALUES (?, ?, ?, ?, ?)  [["created_at", Sat, 22 Mar 2014 21:29:06 PDT -07:00], ["day_id", 20140322], ["end_time", 2014-03-22 21:28:57 -0700], ["start_time", 2014-03-22 21:28:52 -0700], ["updated_at", Sat, 22 Mar 2014 21:29:06 PDT -07:00]]
(7.6ms)  commit transaction
=> true



# Here's the problem
Day.all
Day Load (0.2ms)  SELECT "days".* FROM "days"
=> #<ActiveRecord::Relation [#<Day id: 20140322, created_at: nil, updated_at: nil>]> 
2.0.0-p247 :015 > Timeslot.all
Timeslot Load (0.2ms)  SELECT "timeslots".* FROM "timeslots"
=> #<ActiveRecord::Relation [#<Timeslot id: 2, created_at: nil, updated_at: nil, start_time: nil, end_time: nil, day_id: 20140322>]> 
a = Day.all.first
Day Load (0.2ms)  SELECT "days".* FROM "days" ORDER BY "days"."id" ASC LIMIT 1
=> #<Day id: 20140322, created_at: nil, updated_at: nil> 
a.timeslots
Timeslot Load (0.3ms)  SELECT "timeslots".* FROM "timeslots" WHERE "timeslots"."day_id" = ?  [["day_id", 20140322]]

=> #]>

Дело в том, что объекты временного интервала просто не созданы должным образом. Я не уверен, почему это происходит.


person sparkFinder    schedule 23.03.2014    source источник
comment
Вы не назначаете дни временным интервалам при их создании. Вам нужно сделать t.day = d после t = Timeslot.new, чтобы назначить созданный d на t.   -  person vee    schedule 23.03.2014
comment
Значит, t.day_id = ‹dayId› недостаточно? Кроме того, почему значения start_time и end_time для t не сохраняются в t.save, несмотря на то, что им были присвоены допустимые значения?   -  person sparkFinder    schedule 23.03.2014
comment
Делаем t.day = d; т.сохранить; после установки времени начала и окончания в t по-прежнему отображается [#‹Идентификатор временного интервала: 2, created_at: nil, updated_at: nil, start_time: nil, end_time: nil, day_id: 20140322›]› Где start_time и end_time не получают написано :/   -  person sparkFinder    schedule 23.03.2014
comment
моя вина. Я этого не видел. Я смутился, увидев только числовую дату.   -  person vee    schedule 23.03.2014


Ответы (1)


Есть несколько вещей, которые я не понимаю в ваших файлах, и я думаю, что вы должны использовать инструменты командной строки ruby ​​для создания ваших файлов, чтобы быть уверенным, что не сделаете никакой ошибки. Например, ваши created_At и updated_at не являются нормальными, они должны быть заполнены автоматически, а это не так.

Я предлагаю вам удалить ваши файлы и запустить эти команды

rails g model day calendar:references
rails g model timeslot start_time:time end_time:time  day:references

Затем вы добавляете свою ассоциацию к моделям

class Day < ActiveRecord::Base
  has_many :timeslots
  belongs_to :calendar
end
class Timeslot < ActiveRecord::Base
  has_many :events
  belongs_to :day
  validates_presence_of :start_time
  validates_presence_of :end_time
  # validates_presence_of :day_id #Remove this line for now
end

А можно запустить rake db:migrate и попробовать еще раз (кстати Day.all.first это то же самое, что и Day.first и вместо t.day_id = ... попробовать t.day = Day.first

person Uelb    schedule 23.03.2014