我正在研究 Rails,现在正在尝试组织模型之间的交互。我写的东西很有效,但我认为代码闻起来很糟糕。
例如,我有两个带有数据库表的模型Parcel
和Warehouse
. 当我创建一个新 Parcel 时,我想增加:current_weight
与这个新 Parcel 相关的 Warehouse 实例的数量。
再次,一切正常,但是这种类型的代码,两个不同对象之间的交互,将被频繁使用,我内心深处的一句话是:“伙计,这个代码很糟糕,将来会引起问题!”。
也许有一些好的做法来组织或重构它?也许最好为这种交互创建一个通用模块,或者甚至创建
method_missing
逻辑来使用具有universal put_
, remove_
,
check_
, like warehouse.put_parcel
and的方法warehouse.remove_parcel
。
在红宝石控制台中:
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
包裹.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