Active Record和Ruby on Rails奇怪的行为

时间:2015-11-04 09:59:18

标签: ruby-on-rails-4 activerecord activerecord-relation

您好我有两个模型通过第三个模型相互关联。两个主要模型是UserClub,它们通过Reservations表格具有关系。 Reservation模型有一个名为active的列,它是一个布尔值。 UserClub之间的关系是has_manyhas_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

0 个答案:

没有答案