2015-02-01 4 views
-1

"하나의"검색 양식을 통해 여러 모델 중 하나의 편집 기능에 액세스 할 때 사용할 수있는 짧은 Base64 토큰이 게스트에 제공되는 응용 프로그램에서 작업하고 있습니다. "응용 프로그램 홈 페이지에 있습니다.복수 모델의 편집 기능에 대한 토큰 액세스

저는 이미 토큰 기능을 생성하고 필요한 모델에 대한 스키마에 포함 시켰습니다. 내 질문은, 홈페이지에서 액세스 토큰을 사용하여 편집 기능을 가장 잘 검색하고 액세스하는 방법은 무엇입니까?

이 작업을 수행하는 데 좋은 방법을 찾는 데 어려움을 겪고 있으며 액세스 토큰에 대해 많은 것을 알고있는 동안 대부분은 사용 사례와 관련이없는 것 같습니다.

+0

나는 당신이 성취하려는 것을 이해하는 데 어려움을 겪고 있습니다. 이것을 설명하는 샘플 코드를 제공 할 수 있습니까? – jwadsack

+0

나는이 순간에 작업을 위해 작성한 코드 수준으로 설명하기가 힘듭니다 ... 기본적으로 내가 성취하고자하는 것은 이것입니다. 테이블에 다양한 열이있는 모델이 여러 개 있습니다. 'access_token'을 제외하고는 다릅니다. 'access_token'으로 모든 모델을 검색하고 해당 레코드의 편집 경로를 열 수있는 방법을 찾고 싶습니다. (예 : @ beds.access_token) – PSCampbell

+0

더 잘 설명하려면 - 모델을 알 필요가없는'Model.find (options)'에 옵션이 있습니까 - 그냥 옵션입니까? (이 경우'something.find (access_token => % 검색 입력 %)') – PSCampbell

답변

0

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) 
관련 문제