首先,我将为滑雪板、客户和商店生成单独的模型。
script/generate model Snowboard name:string price:integer ...
script/generate model Customer name:string ...
script/generate model Store name:string ...
(rails 自动生成id
和created_at
,modified_at
日期)
为了保留历史记录,我不会从这些表中复制行/值,除非有必要(例如,如果您想跟踪客户租用它的价格)。
相反,我会使用SnowboardHistory
您描述的类似属性创建 SnowboardEvent 模型(如果您愿意,可以调用它,但个人感觉创造新历史很奇怪):
ev_type
(即 0 表示退货,1 表示维护,2 表示租金...)
snowboard_id
(不为空)
customer_id
store_id
例如,
script/generate model SnowboardEvent ev_type:integer snowboard_id:integer \
customer_id:integer store_id:integer
SnowboardEvent
然后我会设置,Snowboard
和Customer
之间的所有关系Store
。滑雪板可以具有类似的功能current_state
,current_store
实现为
class Snowboard < ActiveRecord::Base
has_many :snowboard_events
validates_presence_of :name
def initialize(store)
ev = SnowboardEvent.new(
{:ev_type => RETURN,
:store_id => store.id,
:snowboard_id = id,
:customer_id => nil})
ev.save
end
def current_state
ev = snowboard_events.last
ev.ev_type
end
def current_store
ev = snowboard_events.last
if ev.ev_type == RETURN
return ev.store_id
end
nil
end
def rent(customer)
last = snowboard_events.last
if last.ev_type == RETURN
ev = SnowboardEvent.new(
{:ev_type => RENT,
:snowboard_id => id,
:customer_id => customer.id
:store_id => nil })
ev.save
end
end
def return_to(store)
last = snowboard_events.last
if last.ev_type != RETURN
# Force customer to be same as last one
ev = SnowboardEvent.new(
{:ev_type => RETURN,
:snowboard_id => id,
:customer_id => last.customer.id
:store_id => store.id})
ev.save
end
end
end
和客户会有相同has_many :snowboard_events
的。
Snowboard.snowboard_events
检查滑雪板或客户历史记录只需使用或遍历记录即可Customer.snowboard_events
。“时间数据”将是created_at
这些事件的属性。我不认为使用 Observer 是必要的或相关的。
注意:上面的代码没有经过测试,也不是完美的,只是为了得到这个想法:)