0

나는, 콜백 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_typeOrange으로 설정하므로 self.class

처럼 Orange 클래스로 결정됩니다. 내가 부모 클래스에 default_scope 내부 Orange 클래스 이름을 사용하는 방법 :

하지만

내가 >> Orange.all 호출하는 경우

이 방법은 default_scope 내부 self.to_sProduct 클래스 = (

그래서, 여기에 질문이 적용됩니다 (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') 

즉 :

+1

질문에 대한 답변이 아니지만 [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' '' ' –

+0

@ NathanWallace, 결과는 동일합니다 :'SELECT products . * 제품에서 WHERE products.product_type = 'Product'' – okliv

+0

하위 클래스 (주황색)가 아직로드되지 않은 경우 발생할 수 있습니다. 몇 시간 동안 require_dependency가 유용 할 때 발생합니다. –

답변

1

그냥 여기 STI를 사용합니다. default_scope 또는 after_initialize을 수행하지 마십시오. 다른 모델에서 상속하자마자 Rails가 이미 적용되었으므로 Rails는 STI를 사용한다고 가정하고 쿼리에 올바른 것을 추가합니다.

+0

이것이 내 현재의 문제를 해결 한 것이므로 받아 들여지지 만 더 일반적인 질문은 여전히 ​​실제입니다 -> 어떻게 부모 클래스 레벨 메소드를 작성할 수 있습니까 (예를 들어서는 아니지만'def self ... ...'). 레벨 메소드 (즉, 부모 클래스'def self.current_sti_class_name' 메소드 내부의 자식 클래스 이름) – okliv

+0

이 코멘트에서 요구하는 것을 수행하는 것에 대해 복잡한 것은 없지만, Rails의'after_initialize' 메소드를 사용하면 거기에 도달 할 수 없습니다 왜냐하면 그것은'self'에서 닫히기 때문에'self'는'after_initialize'가 실행되었을 때의 것이 될 것입니다. 항상 부모 클래스가됩니다. 만약 당신이 루비만을 사용한다면, 자동적으로 당신이 원하는 것이 생깁니다 :'class Foo; def self.blah; 자기를 넣는다. 종료; 종료; class Bar '바' – smathy