2016-09-20 6 views
0

私は固執していますが、私はRoRで正しいレコードを作成してアクティブなレコードを得る方法がわかりません。RubyでRubyで正しいと効率的なコードを書く方法

テーブル間の関係:モデルの

imed_patient has one imed_operator 
imed_operator has many imed_operator_contacts 
imed_patient has_many imed_operator_conatc through imed_operator 

定義:PostgreSQLの

class ImedOperator < ActiveRecord::Base 
    self.table_name = "imed_operator" 
    self.primary_key = "code" 

    has_one :imed_patient, foreign_key: 'r_opr_code' 
    has_many :imed_operator_contact, :foreign_key => "r_opr_code" 
end 

class ImedOperatorContact < ActiveRecord::Base 
    self.table_name = "imed_operator_contact" 
end 

class ImedPatient < ActiveRecord::Base 
    self.table_name = "imed_patient" 
    self.primary_key = "code" 

    has_many :visit, :foreign_key => "r_ptn_code" 
    belongs_to :imed_operator , foreign_key: 'r_opr_code' 
    has_many :imed_operator_contact, through: :imed_operator 
end 

良いSQL:

select * from imed_patient 
     INNER JOIN imed_operator ON imed_patient.r_opr_code = imed_operator.code 
     INNER JOIN imed_operator_contact ON imed_operator.code = imed_operator_contact.r_opr_code 
    where (imed_operator_contact.r_ct_id = 1 or imed_operator_contact.r_ct_id = 2) and imed_operator_contact.value = '501' 

コードは今(働いていない)である。

@pacjenci = ImedPatient.ImedOperatorContact.where('imed_operator_contact.r_ct_id = ? or imed_operator_contact.r_ct_id = ? and imed_operator_contact.value = ?',1,2,'+48501') 
実行中

エラー:PacjenciController#1 szukajpacjenttel未定義のメソッド ` ImedOperatorContact」で

NoMethodError#

のために誰もが私を助けることができますか?

はインスピレーションのための

みんなありがとうを解決しました。私は12.1.3.2がネストされた団体に参加hereポイントからの情報を使用

@pacjenci = ImedPatient.joins(:imed_operator).joins(:imed_operator_contact).where('imed_operator_contact.value' => '+48501', 'imed_operator_contact.r_ct_id' => [1,2]) 

(マルチレベル)あなたのImedPatientにこれを追加することAndy

+0

これはおそらくあなたにとって役に立ちます。私のSQlステートメントの複雑さが増えたら、私はSQLを直接呼び出す方が好きです。 'http:// api.rubyonrails.org/classes/ActiveRecord/Querying.html'あなたのケースの' ImedPatient.find_by_sql() 'のようなもの – theDrifter

答えて

1

しようとする

スペシャルサンクス:私は、ことによってそれを解決し

has_many :imed_operator_contacts, through: :imed_operator 

これでActiveRecord/arelスタイルのクエリを使用できるはずです:

imed_patient.imed_operator_contacts.where(value: '501') 
+0

これはArel、btwではありません。これはActiveRecordです。 Arelコードははるかにかわいいです:)(['users.where(users [:age] .eq(10)).project(Arel.sql( '*'))'](https://github.com/rails/arel)) –

+0

はい、私はかなり認識しています。 – AndyV

+0

まだ「アイルスタイル」と言っています。これはかなりarelスタイルではないですか? –

関連する問題