Как организовать ресурсы более эффективно - PullRequest
0 голосов
/ 25 января 2012

Я создаю приложение rails, и есть часть, которая вызывает у меня некоторые проблемы при разработке моего кода. Я чувствую, что я делаю это слишком грязно, и я хотел бы знать, есть ли шаблон дизайна или вообще лучший способ сделать это. Ситуация такая:

У меня есть модель города, и город может хранить дерево, камень и золото. Эти ресурсы меняются со временем в зависимости от их временных отметок. У них есть свои собственные атрибуты, такие как количество, change_timestamp.

Теперь я подумал, что создание 3-х отдельных моделей, таких как wood_production, stone_production и gold_production, казалось хорошей идеей, казалось вполне адекватным. Я также создал делегаторы и виртуальные атрибуты, чтобы я мог выполнить что-то вроде:

city.wood or city.stone

Однако проблемы возникают, когда я хочу изменить сумму или метку времени для определенного типа ресурса. Скажите, что здание стоит

{:wood => 200, :stone => 100, :gold => 50}

должно быть создано. Итак, скажем, что здание создано, и теперь я должен сократить ресурсы города. Для этого мне нужно сделать что-то вроде:

self.wood_production.update_attribute(:change_timestamp, Time.now)
self.wood -= v
self.save

Проблема в том, что это зависит от ресурса. Мне бы очень хотелось иметь метод set_resource, который работает с процедурой, не заботясь о типе ресурса (без использования ifs и дополнительных спагетти).

Как бы вы это сделали?

1 Ответ

1 голос
/ 25 января 2012

Самый простой способ ничего не менять и использовать имеющийся у вас код - просто добавить метод, подобный следующему:

def modify_resource!(type, quantity)
    self.send("#{type}_production").update_attribute(:change_timestamp, Time.now)
    self.send("#{type}=", self.send(type) + quantity)
    self.save
end

Вызов city.modify_resource!(:wood, -10) вычтет 10 дров и обновит метку времени.

Это также зависит от того, как вы храните данные.Общее количество ресурсов хранится в городе или в таблицах * _production, а self.wood является просто псевдонимом wood_production?

Существует не так много других способов организации занятий, если вы не хотитепойти по более простому методу, который хранит больше данных для каждого города, например, хранить change_timestamp с моделью города, а не в отдельной таблице.

...