Uzywanie atrybutów obiektu w metodach obiektu innej klasy

juz wyjasniam o co mi chodzi. mamy klasy

class People
attr_accessor :number, :document
end

class Document
end

teraz tworzymy sobie nowy plik, w ktorym odnosimy sie do zrodla naszych klas

require ‘./People.rb’
require ‘./Document.rb’

torrance = People.new
torrance.number = 1
torrance.document = Document.new

i teraz mamy clue programu. w metodzie instancji klasy Document, chcialbym moc odniesc sie do atrybutu number obiektu klasy People. np zrobic cos takiego:

def some_method
if torrance.number ==1
puts “hello world”
end
end

Ma ktoś pomysł, jak taki efekt (w postaci dzialajacej metody) osiagnac?

W tym przypadku chyba najlepiej tak:

[code=ruby]class Document
def some_method
torrance.hello_world
end
end

class People
def hello_world
puts “hello world” if number == 1
end
end[/code]
(Wyjasnienie: http://robots.thoughtbot.com/post/27572137956/tell-dont-ask)

EDIT:

Zeby osiagnac to z poziomu instancji Document ta instancja musi wiedziec o obiekcie torrance. Wiec bedziesz tez potrzebowal

torrance.document = Document.new(torrance: torrance)

nie o to mi jednak chodzi, Ty tutaj po prostu przepisales metode z jednej klasy do drugiej

Bo w przypadku jaki opisales, ta metoda tam powinna byc. Twoim problemem jest powiazanie obiektow, tzn. chcesz zeby obiekt People mial referencje do obiektu Document i odwrotnie. Wtedy wywolywanie metod jest proste.

dokładnie:)

Tak wiec: jesli uzywasz Railsow (w koncu forum railsowe) to potrzebujesz Associations (http://guides.rubyonrails.org/association_basics.html). Jesli nie uzywasz to musisz z palca:

[code=ruby]class Person
def hello_world
puts “hello world” if number == 1
end
end

class Document
def initialize(person)
@person = person
end

def some_method
@person.hello_world
end
end

torrance = Person.new
torrance.number = 1
document = Document.new(torrance)
torrance.document = document[/code]
O to Ci chodzilo?

Uwagi poboczne:
Klasa prawdopodobnie powinna sie nazywac Person a nie People. Rowniez konwencja - nazwy plikow z malej litery.

musze przemyslec czy takie rozwiazanie mi nie narobi zamieszania w projekcie, ale dzieki za pomoc;]

Poczytaj sobie również o Low of Demeter.