【发布时间】:2013-03-25 02:35:32
【问题描述】:
我正在研究 Rails,现在正在尝试组织模型之间的交互。我写的东西有效,但我认为代码闻起来很糟糕。
例如,我有两个带有数据库表 Parcel 和 Warehouse 的模型。当我创建一个新的 Parcel 时,我想增加与这个新 Parcel 相关的 Warehouse 实例的:current_weight。
再一次,一切正常,但是这种类型的代码,两个不同对象之间的交互,将被频繁使用,我的内心深处说:“伙计,这段代码很糟糕,将来会出问题!”。
也许有一些好的实践来组织或重构它?也许是
最好为此类交互创建一个通用模块,甚至创建
method_missing 使用通用方法的逻辑 put_, remove_,
check_,如 warehouse.put_parcel 和 warehouse.remove_parcel。
在 ruby 控制台中:
parcel = Parcel.new
parcel.weight = 10
parcel.warehouse_id = 1
parcel.save
# Create parcel and increase :current_weight of related warehouse by 10 after save
仓库.rb:
class Warehouse < ActiveRecord::Base
has_many :parcels
attr_accessible :name, :current_weight
end
parcel.rb:
class Parcel < ActiveRecord::Base
belongs_to :warehouse
belongs_to :vehicle
attr_accessible :name, :weight, :warehouse_id, :vehicle_id
after_save :set_current_weight
#Bad code:
def set_current_weight
@wh = self.warehouse
@wh.current_weight = @wh.current_weight + self.weight
@wh.save
end
end
【问题讨论】:
标签: ruby-on-rails ruby design-patterns refactoring models