2017-10-10 17 views
0

나는 dispatch라는 모델을 다른 두 모델 인 참조 요청 및 임상의와 관련된 조인 테이블로 사용합니다. 내 응용 프로그램에서 직원 사용자는 환자가 찾고있는 것에 대한 세부 정보가 들어있는 조회 요청 레코드를 만듭니다. 작성되지 않은 로직은 환자 기록에 명시된 적어도 하나의 보험에 부합하는 모든 임상의 사용자를 찾게되며, 이로 인해 각 임상의에게 우편 발송자가 발송됩니다. 파견 모델은 추천 요청과 임상의 사이의 관계를 기록하려고 시도하는 방식이므로 어떤 임상의가 이메일을 받았는지 알고 응답을 기록 할 수 있습니다 (예 또는 아니오).pundit 정책을 사용하여 다른 클래스의 개체 범위 제한

임상의는 시장에 속하며 직원은 시장에 속한 대학에 속합니다.

각 임상의는 임상의 프로필이 있으며 clincian_profiles 테이블 외에도 clinician_profiles_insurances 테이블이 있습니다. 그래서 임상가 인 주어진 사용자에게 .clinician_profile.insurances를 호출하고 그들이받는 모든 보험을 반환 할 수 있습니다.

특정 추천 요청에 대해 보험에 전화하여 환자가 보유하고있는 모든 보험을 표시 할 수도 있습니다. 직원 사용자의 대학과 같은 시장에서

- 단지 쇼 임상 사용자 :

나는 다음을 수행하기 위해 파견 새로운 방법 내에서 학자 정책의 범위를 사용하는 것을 시도하고있다.

- 추천 요청과 일치하는 보험이 적어도 하나있는 임상의 사용자 만 표시합니다.

시장의 범위를 제한하는 데는 아직까지 최선의 방법이 아닙니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

파견 정책

class DispatchPolicy < ApplicationPolicy 
    class Scope 
    attr_reader :user, :scope 

    def initialize(user, scope) 
     @user = user 
     @scope = scope 
    end 

    def resolve 

     if user.admin? 
     scope.all 
     else 
     scope.joins(:clinician).merge(User.where(market: user.market)) 
     end 
    end 
    end 

내 사용자가 여러 역할 : 여기

class Dispatch < ApplicationRecord 
    belongs_to :referral_request 
    belongs_to :clinician, class_name: 'User', foreign_key: 'user_id' 

class ReferralRequest < ApplicationRecord 
    belongs_to :user, -> { where role: :staff } 
    has_many :dispatches 
    has_many :clinicians, through: :dispatches 

module StaffUser 
    extend ActiveSupport::Concern 

    included do 
    belongs_to :university 
    has_many :patients 
    has_many :referral_requests 
    validates :university_id, presence: true, if: :staff? 
    end 

내입니다 : 여기

enum role: { staff: 0, clinician: 1, admin: 2 } 

는 관계있다 파견 컨트롤러의 새로운 방법 : 나는

1) 임상의 모든 사용자를 보여주기 위해 노력하고 여기 어디에

def new 
@clinicians = policy_scope(Dispatch) 
@dispatch = @referral_request.dispatches.new 
end 

이 파견의 테이블/new.html.erb 2)에 속하는 직원 사용자의 대학과 동일한 시장 3) 추천 요청과 관련된 보험과 일치하는 임상의 프로파일에 최소한 하나의 보험이 있어야합니다.

<% @clinicians.each do |clinician| %> 
    <tr> 
    <td><%= clinican.id %></td> 
    <td><%= clinican.name %></td> 
    <td><%= clinican.market.name %></td> 
    <td><%= clinican.clinician_profile.insurances.map(&:name).to_sentence %></td> 
    <td><%= clinican.clinician_profile.genders.map(&:name).to_sentence %></td> 
    <td><%= clinican.clinician_profile.races.map(&:name).to_sentence %></td> 
    <td><%= clinican.clinician_profile.languages.map(&:name).to_sentence %></td> 
    </tr> 
<% end %> 
</tbody> 
</table> 

보험 모델 :

class Insurance < ApplicationRecord 
    has_and_belongs_to_many :patients 
    has_and_belongs_to_many :clinician_profiles 
    has_and_belongs_to_many :markets 
end 

환자 모델

class Patient < ApplicationRecord 
    belongs_to :author, -> { where role: :staff }, class_name: 'User', foreign_key: 'user_id' 

    has_and_belongs_to_many :genders 
    has_and_belongs_to_many :concerns 
    has_and_belongs_to_many :insurances 
    has_and_belongs_to_many :races 
    has_many :referral_requests 
    belongs_to :staff_doctor, class_name: 'User', foreign_key: 'staff_doctor_id' 

    def has_referral? 
    !self.referral_requests.empty? 
    end 
end 

**Clinician concern** 
require 'active_support/concern' 

module ClinicianUser 
    extend ActiveSupport::Concern 

    included do 
    has_one :clinician_profile 
    has_many :lists 
    has_many :universities, through: :lists 
    has_many :dispatches 
    has_many :referral_requests, through: :dispatches 
    after_create :create_clinician_profile 
    belongs_to :market 
    validates :market_id, presence: true, if: :clinician? 
    end 

    class_methods do 
    end 
end 

직원 우려

require 'active_support/concern' 

module StaffUser 
    extend ActiveSupport::Concern 

    included do 
    belongs_to :university 
    has_many :patients 
    has_many :referral_requests 
    validates :university_id, presence: true, if: :staff? 
    end 

    class_methods do 
    end 
end 

임상 프로필 모델 심지어 올바른 방법이 생각

class ClinicianProfile < ApplicationRecord 
    belongs_to :user, -> { where role: :clinician } 
    has_and_belongs_to_many :languages 
    has_and_belongs_to_many :races 
    has_and_belongs_to_many :insurances 
    has_and_belongs_to_many :genders 
end 

건가요? 범 학파 정책은 내가하려는 일의 전부 또는 일부에 대한 좋은 해결책입니까? 모든 의견에 감사드립니다. 나는 분명히 약간 길을 잃었다.

답변

0

왜 한 번에 하나의 문제를 해결하지 않습니까?

지금 전문가를 무시하고 예상 한 결과를 반환하는 ActiveRecord 쿼리를 제안하십시오.

user = User.where(role: :staff).first 
Dispatch.joins(:clinician).merge(User.where(market: user.market)) 

이것은 "임상의"와 합류합니다. 실제로 모델의 "클래스 : 사용자"로 인해 실제로 "사용자"테이블이라고 생각합니다. 이 쿼리는 파트 1과 파트 2에서 문제가없는 것처럼 보입니다.

AR 쿼리를 실행하면 먼저 모든 디스패치를 ​​사용자와 결합하고 정책에 전달 된 "현재 사용자"와 동일한 '시장'이있는 디스패치 만 선택해야합니다 .

그러나 기억 :

@clinicians = policy_scope(Dispatch) 

반환 파견하지 "임상"(사용자), 당신이 쓴 코드에서, "clinicians.id"그래서 당신은 '돈 무엇 디스패치 테이블 ID 될 것이다 원하는가? 내가 틀렸다면.

먼저 작동하지 않는 경우 먼저 파트 1과 2를 사용해보십시오.

파트 3 "추천 요청과 관련된 보험에 맞는 임상의 프로필에 적어도 하나의 보험이 있어야합니다."

"추천 요청"에도 가입해야하고 더 많은 SQL을 수행하는 것처럼 들리 겠지만 도메인에서 보험이 어떻게 계산되는지는 알 수 없습니다 (has_many : insurance_plans 등). 더 많은 정보가 필요합니다.)

+0

감사합니다. 내가 제안한대로 사용자를 지정한 다음 콘솔에서 두 번째 줄을 실행하면 실행되지만 비어있는 내용을 반환합니다. user.market은 보스턴 (id : 2)을 반환합니다. 보스톤에 살고있는 DB에 임상의가 있습니다. 나는 오해를할지 모르지만, 작성한 쿼리가 검색을 수행하고 파견을 반환하는 것으로 보입니다. 그러나 제가 반환하고자하는 것은 임상의들의 목록입니다. 나는 아주 잘 빠져있을 수 있습니다, 그래서 제게 당신이 생각하는 것을 알려주십시오. – mike9182

+0

보험 등을위한 추가 모델을 추가하여 보았습니다. – mike9182