witam
mam modul powiedzmy Extensions ktory jest includowany do modelu powiedzmy Projects, jak moge dodac gettery i settery, ktorymi poslugiwał bym sie tak jakby model mial przypisany hash, czyli np
P = Project.new
p.moje[:cos] = “lala”
p.moje[:cos]
podejrzewam ze potrzebuje w module cos na ksztalt:
konkretnie to chodzi o cos takiego ze pewne wartosci modelu trzymane sa w redis, sa to zserializowane hashe, dotychczas mam takie metody, ale chcialbym zeby to dzialalo jak tablica
def set_setting(key, value)
$redis.hset "jakisklucz", key, value.to_json
end
def get_setting(key)
$redis.hexists("jakisklucz", key) ? JSON.parse($redis.hget "jakisklucz", key) : nil
end
nie bardzo rozumiem, bo to doda chyba mozliwosc ustawiania dowolnych kluczy i wartosci w modelu gdzie modul jest includowany, a ja chcialbym sie odwoływac tak jak wyzej napisałem o ile to możliwe
[code=ruby]class SettingsMixin
def initialize @settings ||= {}
end
def @settings.fetch key
end
def []=(key, value) @settings.store key, value
end
end
module SettingsModule
def self.included(base)
base.class_eval do
def initialize @settings = SettingsMixin.new
super
end
attr_accessor :settings
end
end
end
class Settings
include SettingsModule
end
setting = Settings.new
setting.settings[:key] = ‘value’
puts setting.settings[:key]
puts setting.settings[:no_key] #=> IndexError: key not found[/code]
pozmieniaj sobie po prostu metody [] i []= na to co tam musi być (nie używałem redis to nie wiem ;)) and you’re ready to go
Dzięki, troche już to rozjaśniło, ale to jeszcze nie to. Działa gdy tworzę nowy obiekt Setting.new ale już dla istniejących Settings.last.setting zawsze jest nil. Jak można to wmiksować zeby działało dla wszystkich settings
Tzn.? Bo nie bardzo rozumiem. W takiej postaci jaką podałem to całkiem normalne zachowanie W końcu te ustawienia nigdzie się nie zapisują (to zwykły Hash). Tak jak mówiłem musisz pozmieniać [] i []= tak żeby pobierało/zapisywało z/do redis-a
Poza tym twój przykład nigdy nie zadziała (no chyba, że zdefiniujesz metodę last w klasie Settings). Jeśli już to: Settings.settings.last