나는, 콜백 after_initialize
작품 등이이호출 자식 클래스 방법은
class Orange < Product #Apple, Carrot, ...
end
같은 레일 4 응용 프로그램이 모델
class Product < AR::Base
default_scope -> { where(product_type: self.to_s) }
after_initialize { self.product_type = self.class.to_s }
end
및 많은 다른 사람이 예상 됨 : 인스턴스 속성 product_type
을 Orange
으로 설정하므로 self.class
은
Orange
클래스로 결정됩니다. 내가 부모 클래스에
default_scope
내부
Orange
클래스 이름을 사용하는 방법 :
하지만
내가 >> Orange.all
호출하는 경우
default_scope
내부
self.to_s
는
Product
클래스 = (
그래서, 여기에 질문이 적용됩니다 (Product
) Orange
클래스 안에 어떤 메소드를 쓰고 싶지 않을 경우를 대비해서 (Orange
과 같은 많은 서브 클래스가 있기 때문에 모든 것을 DRY 상태로두고 싶습니다.) 감사합니다 내가
>> Apple.all
(다형성 협회의 일종)를 호출하는 경우
내가 Apple
클래스가있는 경우 등등, 그 이름이이 default_scope
모든 Product
필터링에 사용되는.
class Product < ActiveRecord::Base
self.inheritance_column = :product_type
end
class Orange < Product
end
# then...
> Orange.all
Orange Load (0.1ms) SELECT "products".* FROM "products" WHERE "products"."product_type" IN ('Orange')
즉 :
질문에 대한 답변이 아니지만 [STI]를 사용하고 있는지 알고 계셨습니까? (http://eewang.github.io/blog/2013/03/12/how-and-when-to-use) -single-table-inheritance-in-rails /) ActiveRecord는 서브 클래스에서 질의 메소드를 호출 할 경우이를 수행합니까? "Product.all.to_sql =>"제품 선택 "* Orange.all.to_sql =>"SELECT * FROM products where 타입 = 'Orange' '' ' –
@ NathanWallace, 결과는 동일합니다 :'SELECT products . * 제품에서 WHERE products.product_type = 'Product'' – okliv
하위 클래스 (주황색)가 아직로드되지 않은 경우 발생할 수 있습니다. 몇 시간 동안 require_dependency가 유용 할 때 발생합니다. –