Rails는 모델 클래스가 상위 모델 클래스에서 상속 될 수있는 기능을 제공합니다. 그런 다음 모델은 공유 속성을 가질 수 있지만 고유 한 속성도 가질 수 있습니다. 데이터베이스에서 이러한 모든 모델 오브젝트는 모든 클래스에 대해 동일한 테이블에 저장되므로이를 단일 테이블 상속 또는 STI라고합니다. (here에 문서화되어 있지만 블로그 게시물에는 더 나은 문서가 있습니다.)
이 방법을 사용하면 일치하는 개체/레코드를 찾기 위해 모든 인스턴스의 상위 클래스를 검색 할 수 있습니다.
class AccessToken < ActiveRecord::Base
# has attribute access_token, and maybe others
end
class OneAccessibleKind < AccessToken
# may have other attributes
end
class AnotherAccessibleKind < AccessToken
# may have other attributes
end
마이그레이션은 다음과 같이 보일 것입니다 : 그런 다음 부모 클래스에 대해 조회 할 수 있습니다
create_table :access_token do |t|
t.string "access_token"
t.string "type"
# add any additional attributes of subclasses
t.timestamps
end
. 이러한 모든 다시 AccessToken
객체 (즉, 부모 클래스)로 올 것이다
all_models = AccessToken.where(access_token: 'a-token')
참고 참고,하지만 당신은 자신의 기본 클래스가 무엇인지 확인하기 위해 type
속성을 검사 할 수 있습니다.
하지만 사용하지 않는 열이 많으므로 클래스가 대부분 다른 필드 인 경우이 방법이 최선의 솔루션이 아닐 수도 있습니다. 백킹 데이터베이스 (행 지향 SQL이라고 가정) 및 객체 수에 따라 성능 문제가 발생할 수 있습니다.
다른 옵션은 일대일 관계를 사용하고 다른 모델 각각에 대해 AccessToken
모델을 사용하는 것입니다. 여기서 STI 연관을 사용할 수 있습니다.
create_table :access_token do |t|
t.string :access_token
t.integer :owner_id, null: false
t.string :owner_type, null: false
t.timestamps
end
create_table :one_accessible_kind do |t|
# any attributes for this type
t.timestamps
end
는 그런 다음 액세스 토큰을 발견하고 객체를 얻기 위해 각
owner
에 액세스 할 수 있습니다 :이 같은 마이그레이션 뭔가와
class AccessToken < ActiveRecord::Base
belongs_to :owner, :polymorphic => true
end
class OneAccessibleKind < ActiveRecord::Base
has_one :access_token, :as => :owner
end
class AnotherAccessibleKind < ActiveRecord::Base
has_one :access_token, :as => :owner
end
.
AccessToken.where(access_token: 'a-token').map(&:owner)
나는 당신이 성취하려는 것을 이해하는 데 어려움을 겪고 있습니다. 이것을 설명하는 샘플 코드를 제공 할 수 있습니까? – jwadsack
나는이 순간에 작업을 위해 작성한 코드 수준으로 설명하기가 힘듭니다 ... 기본적으로 내가 성취하고자하는 것은 이것입니다. 테이블에 다양한 열이있는 모델이 여러 개 있습니다. 'access_token'을 제외하고는 다릅니다. 'access_token'으로 모든 모델을 검색하고 해당 레코드의 편집 경로를 열 수있는 방법을 찾고 싶습니다. (예 : @ beds.access_token) – PSCampbell
더 잘 설명하려면 - 모델을 알 필요가없는'Model.find (options)'에 옵션이 있습니까 - 그냥 옵션입니까? (이 경우'something.find (access_token => % 검색 입력 %)') – PSCampbell