Delegate

Witam,

Mam taki kod:

class Post belongs_to :user delegate :name, :to => :user, :allow_nil => true end
I Mogę teraz do nazwy usera dostać się przez Post.user_name

Czy można zmienić nazwe przez którą się dostaję, tzn. zamiast Post.user_name, chciałbym Post.reader

Pozdrawiam

Niestety, delegate przyjmuje jedynie opcje :to, :allow_nil oraz :prefix (ta metoda może delegować więcej niż 1 pole, więc ciężko byłoby tu dodać ustawianie nazwy). Jedyne co pozostaje to napisać metodę

def reader; user.name; end

[code=ruby]class Post
belongs_to :reader, class_name: “User”
end

class User
def to_s
name
end
end[/code]
Myśle, że to da efekt, którego oczekujesz: wywołując

@post.reader

otrzymasz imię usera.

Niezupełnie, otrzymasz wtedy obiekt użytkownika, więc o ile w tym przypadku:

"Dear Mr. #{reader}"

wszystko będzie ok, bo zostanie wywołana automatycznie metoda to_s, o tyle np. poniższe wywołania będą zwracały błędy:

[code=ruby]“Dear Mr.” + reader

reader.capitalize[/code]

“zamiast Post#user_name, chciałbym Post#reader”

[code=ruby]require ‘forwardable’

class Post
extend Forwardable
belongs_to :user

def_delegator :@theObject, :methodName, :desiredMethodName

def_delegator :user, :name, :reader
end[/code]
http://oneofthesedaysblog.com/ruby-day-4-forwardable/

“zamiast Post#user_name, chciałbym Post#reader”[/quote]
KISS +1

Zadziwia mnie, po co ludzie używają tyle kodu, zamiast napisać, to co wcześniej pokazał Arnvald: def reader; user.name; end - ta funkcja jest nawet krótsza od wywołania samej metody def_delegator :user, :name, :reader. Warto? Co z KISS?

Tylko to nie zadziała tak samo jak delegacja, musiałbyś zrobić:

def reader user.name if user end
UPDATE:

Błąd, def_delegator nie ma takiego sprawdzenia, więc rzeczywiście zachowanie takie same

Różnica nadal niewielka. Ta klasa potrafi coś więcej, co uzasadnia jej użycie? Mnożenie zależności to (prawie) nigdy nie jest dobra droga.

Tak jak napisałem powyżej, pomyliłem się, więc masz rację, nie ma chyba żadnego powodu, dla którego delegator będzie lepszy.

Co do samego tematu jeszcze, to dla mnie samo pytanie jest źle postawione. Post#reader sugerowałby dla mnie zwrócenie obiektu. Już wolałbym tak jak ktoś sugerował asocjację nazwać reader, a to co l0pez chce uzyskać nazwałby Post#reader_name

Jezeli masz do ustawienia 10 delegacji to wtedy uzywasz tego modulu. Spelnia swoje glowne zadanie czyli oszczedza ci pisania literek

def_delegators :@robot, :forward, :backwards, :stop def_delegator :@robot, :stop, :brake
vs

[code=ruby]def forward
@robot.forward
end

def backwards
@robot.backwards
end

def brake
@robot.stop
end[/code]
Chociaz tak jak napisalem wczesniej w tym przypadku KISS ftw