我有几个关联的类如下:
class User < ActiveRecord::Base
has_many :posts, :dependent => :destroy
class Group < ActiveRecord::Base
has_many :posts, :dependent => :destroy
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :groups
现在,我想通过将“活动”字段设置为false来删除用户,组和帖子,并将它们保留在数据库中。最初,我希望破坏用户或组会导致他们的帖子被破坏(删除操作会将标志设置为false),但据我所知,在这种情况下,Ruby只会在不破坏帖子的情况下中断相应的关联。我想知道它是否可以很好地完成,或者我只需要编写一个单独的函数并调用它而不是常规删除?
答案 0 :(得分:1)
我们可以通过一些代码和配置来淘汰它们,而不是从数据库中删除记录。
在app /目录下创建一个名为“Concerses”的新目录。
在此目录中创建一个名为“retireable.rb”的新文件。
将以下代码复制并粘贴到其中:
module Retireable
extend ActiveSupport::Concern
included do
default_scope :conditions => { :retired => false }
scope :retired, :conditions => { :retired => true }
end
def destroy
retire
end
def destroy!
raise StandardError, "Cannot destroy!"
end
def retire
update_attribute :retired, true
update_attribute :retired_at, Time.now
end
def retired?
retired
end
end
4)每个需要此功能的模型必须:
4a)在数据库模式中使用'retired
'布尔字段和'retired_at
'datetime字段。
4b)include Retireable
必须在该模型的类定义范围内;即。
class User < ActiveRecord::Base
include Retireable
...
5)在“config/application.rb
”中添加以下行:
config.autoload_paths << "#{Rails.root}/app/concerns"
现在对instance.destroy(例如@ user.destroy,@ group.destroy)的调用将由可退出处理,因此不会从数据库中删除而不会破坏关联。
希望有所帮助!