【问题标题】:Remove an association programmatically in Rails在 Rails 中以编程方式删除关联
【发布时间】:2010-12-29 00:00:43
【问题描述】:
我正在为 Spree 编写扩展程序,我想删除现有的关联。
给定以下代码:
class Project < ActiveRecord::Base
has_one :status
...
end
如何在运行时删除对has_one :status 的调用?我想删除关联和关联的方法。
【问题讨论】:
标签:
ruby-on-rails
ruby
activerecord
【解决方案1】:
不幸的是,这是一个相当复杂的 DSL 调用,它为类添加了许多方法,您必须删除所有这些方法,这可能不值得。
创建一个新的 CleanProject 类可能更容易,使用组合或继承向其中添加一个 Project 对象,然后只传递对 Project 所需部分的调用。
另一方面,如果您要询问如何删除与该项目相关联的状态(不是删除状态与项目相关的事实,而只是从单个项目中删除单个状态),您会只需调用:
status.project_id = nil
status.save
【解决方案2】:
将其省略并仅在需要时添加呢?
也许您只需要在设计为从 cronjob 或批处理执行的方法中使用的类中的关联?然后您可以评估代码以引入关联。
def need_assoc
eval <<-EOC
class Project < ActiveRecord::Base
has_one :status
...
end
EOC
end
使用 eval 的原因是为了防止在加载类时评估关联。