まず、Snowboard、Customer、Store用に別々のモデルを生成します。
script/generate model Snowboard name:string price:integer ...
script/generate model Customer name:string ...
script/generate model Store name:string ...
(レールは自動的に生成id
しcreated_at
、modified_at
日付を生成します)
履歴を保持するために、必要な場合を除いて(たとえば、顧客がレンタルした価格を追跡したい場合)、これらのテーブルから行/値をコピーしません。
代わりに、あなたが説明したのと同様のプロパティを使用して、SnowboardEventモデルを作成します(必要に応じて呼び出すことSnowboardHistory
もできますが、個人的には新しい履歴を作成するのは奇妙に感じます)。
ev_type
(つまり、0は返品、1は保守、2は賃貸...)
snowboard_id
(nullではない)
customer_id
store_id
例えば、
script/generate model SnowboardEvent ev_type:integer snowboard_id:integer \
customer_id:integer store_id:integer
次に、、、、のすべての関係を設定SnowboardEvent
しSnowboard
ます。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
、これらのイベントのプロパティになります。オブザーバーの使用は必要ではないと思います。
注:上記のコードはテストされておらず、決して完璧ではありませんが、アイデアを得るためだけです:)