您好我有两个模型通过第三个模型相互关联。两个主要模型是User
和Club
,它们通过Reservations
表格具有关系。 Reservation
模型有一个名为active
的列,它是一个布尔值。 User
和Club
之间的关系是has_many
到has_many
,通过Reservation
当用户在俱乐部进行预订时,在预订表中进行输入,并且将预约active
列中的字段设置为真。如果用户在同一个俱乐部进行了另一次预订,那么之前的预订应该active
列从true
更新为false
这是我的代码:
user = User.where(:email => params["user_email"]).first
club = Club.find(params["club_id"].to_i)
reservation = Reservation.new
reservation.club_id = club.id
reservation.user_id = user.id
reservation.active = true
user.reservations.where("club_id = ? AND active = ?", club.id, true).each do |res|
puts res.id
res.active = false
res.save
end
reservation.save
现在user.reservations.where("club_id = ? AND active = ?", club.id, true)
查询返回正确的条目。我更新了值并再次保存。但是,当我查看数据库时,我仍然看到active
列的值为true
。
更奇怪的是,当我在rails console
中运行我在代码中使用的相同命令时,它会返回正确的条目。当我稍微修改命令并尝试查找标记为false
的列的所有条目时,我也得到正确的条目。如果我选择应将active
标记为false
的条目,并尝试此reservation.active == false
,则返回false
,但当我运行user.reservations.where("club_id = ? AND active = ?", club.id, true)
时,结果不会包含条目。
任何人都可以解释为什么我会看到这种奇怪的行为。提前致谢
*更新*
这是我的架构
create_table "reservations", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "club_id"
t.integer "user_id"
t.boolean "active"
end
create_table "clubs", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
end
create_table "users", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "email"
end