Ruby on Rails 3:如何在不删除对象的情况下将对象与数据库中的另一个对象断开连接?

时间:2012-02-27 00:39:06

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

如果我有以下关联......

class Physician < ActiveRecord::Base
  has_many :appointments
  has_many :patients, :through => :appointments
end

class Appointment < ActiveRecord::Base
  belongs_to :physician
  belongs_to :patient
end

我可以通过......添加现有的预约给医生。

appoint = Appointments.find(params[:id])
phys = Physician.find(params[:id])
phys.appointments << appoint
phys.save

但我无法弄清楚如何从医生的约会列表中删除约会而不删除约会。在与Physician表断开连接后,我想将约会保留在约会表中。

非常感谢您的智慧!

3 个答案:

答案 0 :(得分:4)

如果您要删除已有实例的约会,请使用collection.delete

phys.appointments.delete(appoint)

如果要清除所有约会:

phys.appointments.clear

关于这些和许多其他有用的关联方法的详细解释:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html。查找“从关联中删除”部分。

答案 1 :(得分:3)

你可以使用软删除方法:让另一列“删除布尔”或“deleted_at datetime”(这个编码两条信息,记录已被删除的事实和时间)。

然后在您的所有查询中,您只需要尊重这一点:... WHERE deleted_at IS NULL

使用Rails,您甚至可以将其设置为所有查询的默认值:

class Foo < ActiveRecord::Base
  default_scope where('deleted_at IS NULL')
end

答案 2 :(得分:3)

你不能把那个特定的Appointment的{​​{1}}设置为physician_id吗?