2013-07-13 3 views
1

RailsCast # 345 (Hstore)에서 메타 프로그래밍 예제 코드를 사용하고 정적 배열을 다른 (관련없는) 모델에서 생성 된 것으로 대체하려고합니다. 응용 프로그램. 라이언에서 코드 샘플은 다음과 같습니다Ruby on Rails 메타 프로그래밍 - 동적 배열을 사용하여 클래스 메소드 정의

class Product < ActiveRecord::Base 
    attr_accessible :name, :category, :price, :description 

    # store_accessor :properties, :author 

    %w[author rating runtime].each do |key| 
    attr_accessible key 

    define_method(key) do 
     properties && properties[key] 
    end 

    define_method("#{key}=") do |value| 
     self.properties = (properties || {}).merge(key => value) 
    end 
    end 
end 

나는 Foo.pluck(:content).map(&:downcase) 같은 뭔가 이상 %w[author rating runtime]을 대체하고자하지만 작동하지 않습니다. 동적 메서드에 액세스하려고하면 메서드가 정의되지 않은 오류가 발생합니다. 예를 들어

@product.send(foo.content.downcase) # <-- which returns "author" 

를 호출 할 때 내가 얻을 : 그것은 좋은 정적 배열을 사용하여 작동

undefined method `author' for #<Product:0x007ff111df0908> 

.

정적 배열을 대체 할 수 있습니까? 관리자가 채우고 다른 값에 대한 코드를 만질 필요가없는 다른 모델에서이 값을 읽으 려합니다. 똑같은 일을 성취 할 수있는 다른 방법을 열어 라! 시간 내 줘서 고마워.

+0

'Foo.pluck (: content) .map (& : downcase)'은 콘솔에서 시도 할 때 예상 출력을 생성하지만'Product' 클래스가로드 될 때 실행될 때 아무 것도 생성하지 않습니까? 항상 백업으로'method_missing'이 있습니다. –

+0

예. 콘솔에 적절한 배열을 생성하지만 배열이 하드 코드되어 있지 않으면 Product.send (..)가 작동하지 않습니다. method_missing을 살펴 보 겠지만 최후의 수단이되어야한다고 가정합니다. 감사합니다 –

+0

어떤 구체적인 오류보고를 받으셨습니까? Foo가 들어있는 파일을 필요로 했습니까? –

답변

0

배열 [author, rating, runtime]이 Product 클래스의 열이 아닌 것으로 의심됩니다. 그것들은 Product 클래스의 속성으로 정의됩니다. L # 7을 "attr_accessible key"에서 "attr_accessor key"로 바꾸려고 했습니까?

감사합니다.