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>
.
정적 배열을 대체 할 수 있습니까? 관리자가 채우고 다른 값에 대한 코드를 만질 필요가없는 다른 모델에서이 값을 읽으 려합니다. 똑같은 일을 성취 할 수있는 다른 방법을 열어 라! 시간 내 줘서 고마워.
'Foo.pluck (: content) .map (& : downcase)'은 콘솔에서 시도 할 때 예상 출력을 생성하지만'Product' 클래스가로드 될 때 실행될 때 아무 것도 생성하지 않습니까? 항상 백업으로'method_missing'이 있습니다. –
예. 콘솔에 적절한 배열을 생성하지만 배열이 하드 코드되어 있지 않으면 Product.send (..)가 작동하지 않습니다. method_missing을 살펴 보 겠지만 최후의 수단이되어야한다고 가정합니다. 감사합니다 –
어떤 구체적인 오류보고를 받으셨습니까? Foo가 들어있는 파일을 필요로 했습니까? –