Сначала я бы сгенерировал отдельные модели для 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
(не ноль)
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 необходимо или связано.
ПРИМЕЧАНИЕ: приведенный выше код не проверен и ни в коем случае не идеален, но только для того, чтобы понять:)