저는 PHP 개발자입니다. 현재 Rails (3)와 물론 Ruby를 배우고 있습니다. I don't want to believe in magic 그래서 레일스에서 일어나는 일들에 대해 최대한 이해하려고 노력합니다. 내가 흥미를 느낀 것은 ActiveRecord 모델에서 has_one
또는 belongs_to
과 같은 메서드 호출입니다. Rails 메서드는 "has_one"처럼 작동합니까?
# has_one_test_1.rb
module Foo
class Base
def self.has_one
puts 'Will it work?'
end
end
end
class Model2 < Foo::Base
has_one
end
그냥이 파일을 실행하면 출력합니다, 나는 예상대로.
레일 소스를 검색하면서 책임있는 기능을 찾았습니다 : def has_one(association_id, options = {}).
이것은 분명히 인스턴스 (?)이고 클래스 메서드가 아니기 때문에 작동하지 않아야합니다. 내가 할 수있는
# has_one_test_2.rb
module Foo
module Bar
module Baz
def has_one stuff
puts "I CAN HAS #{stuff}?"
end
end
def self.included mod
mod.extend(Baz)
end
end
class Base
include Bar
end
end
class Model < Foo::Base
has_one 'CHEEZBURGER'
end
이제 실행 has_one_test_2.rb
파일가 출력이 CHEEZBURGER 있습니다
self.included
메소드가 호출되며 Baz 모듈 (및 그 인스턴스
has_one
메소드)이있는 Bar 모듈을 확장합니다. 따라서 본질적으로
has_one
메서드가 포함됩니다 (혼합?)를 Base 클래스에 포함시킵니다. 그러나 아직도, 나는 그것을 완전히 얻지 못한다.
Object#extend은 모듈에서 메소드를 추가하지만 여전히 확장을 사용하여이 동작을 재현하는 방법을 잘 모르겠습니다. 따라서 내 질문은 다음과 같습니다.
정확히 무슨 일이 일어 났습니까? 내 말은, 여전히 has_one 메서드가 클래스 메서드가되는 방법을 모르는 것입니까? 어떤 부분이 정확히 그것을 일으켰습니까?
이 메서드 호출 (구성처럼 보입니다)을 만들 가능성이 정말 좋습니다. 이것을 달성하기위한 대안 또는 간단한 방법이 있습니까?