Я относительно новичок в 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]]
=> #]>
Дело в том, что объекты временного интервала просто не созданы должным образом. Я не уверен, почему это происходит.
t.day = d
послеt = Timeslot.new
, чтобы назначить созданныйd
наt
. - person vee   schedule 23.03.2014