2017-04-20 4 views
0

私は一日中脳を痛めつけており、これを動作させることはできません。私はルビーとレールには非常に新しいので、愚かなエラーのために私の謝罪。アクティブレコードテーブルジョイン

私の問題は、3つのテーブルをまとめて@studentsオブジェクトを取得することです。これはうまくいきますが、もし私がexample @ student.nameを呼び出すと、 'name'は存在しません。私は.INCLUDESと.joinを使用してみましたが、同じ問題が起こる

コントローラ 注:下記

は私のコードです。

class MyprojectController < ApplicationController 
    def show 
    @project = Project.find(params[:id]) 
    @dateformat = '%b %e - %H:%M' 
    @user = Student.includes("INNER JOIN researchers ON students.researcher_id = researchers.id 
           INNER JOIN users ON researchers.user_id = users.id").where('user_id = ?', current_user.id) 

end 

ユーザーモデル

class User < ApplicationRecord 
    include EpiCas::DeviseHelper 

    has_many :event_registrations 
    has_many :events, through: :event_registrations 
    belongs_to :project 
    has_many :researchers 
    #has_many :students, :through => :researchers 
    #has_many :supervisors, :through => :researchers 

    # def self.authenticate(username) 
    # where(username: username).first 
    # end 

エンド

研究モデル

class Researcher < ApplicationRecord 
    #belongs_to :project 
    belongs_to :user 
    has_many :supervisor 
    has_many :students 
end 

学生モデル

class Student < ApplicationRecord 
    #Must have the following 
    validates :name, :email, :surname, :email, :supervisor, :registration_number, presence: true 
    #ensures unique email addresses 
    validates :email, uniqueness: true 

    #assosiations 
    belongs_to :researcher 
end 

すべての学生にはresearcher_idがあり、すべての研究者にはuser_idがあります。だから、joinはstudent-> researcher-> userに行き、@userオブジェクト内のすべてのテーブルのすべての属性を使いたいと思っています。

私はStudent.join(:researcher、:user)を使用しようとしましたが、Studentテーブルから研究者テーブルへの結合を試みた後、studentテーブルからuser_idを使用してユーザーテーブルに参加しようとしましたのuser_idが研究者テーブルにあります)。だから私はちょうどクエリを自分で行った。

すべてのデータは「生の属性」として存在しているようです。

ご協力いただければ幸いです!

-James

+0

ActiveRecordで複数の結合を実行すると、データにアクセスするのに少しばかげてしまいます。普通の方法の代わりに '@student [" name "]'を使ってアクセスする必要があるかもしれません。 – octopushugs

+0

ありがとう@Octopushugsと私はあなたが正しい線に沿っていると思うが、それは動作しませんでした:( –

答えて

1

よりもむしろあなたが少ないクエリですべてのデータにアクセスできるようにincludesを使用していますが、まだオブジェクト内のデータへのアクセス権を持っている1つのリターン(あなたはSQLの場合と同様)に何かをしようとして参加します。 ActiveRecordのようなORMを使うことは、オブジェクトを使ってデータにアクセスできることです。 ORMを使用することの欠点は、データがオブジェクトにプッシュされているため、必要なデータを効率的に取得できないことがあることです。 includesを使用すると、オブジェクトで必要なデータにアクセスすることができ、関連ごとにクエリを実行する必要はありません。

(あなたのユーザーIDを取得している方法に応じて - 私はプロジェクトからと仮定している)のような何か試してみてください:

@user = User.includes(researcher: :student).find(project.user_id)

をそしてあなたは、通常のレール団体を通じて物事にアクセスすることができます。

私はことを願っています

researcher = @user.researcher

student = researcher.student

幸運の助けと最高!

+0

これを試して、それはまだunfortunatly.Firstly研究者= @ user.researcherから研究者を見つけることができます第2に、研究者や学生のオブジェクトを作成しなくても、私はまだユーザーセクションの属性にアクセスできません。あなたの助けをありがとう –

+0

もう1つの解決策は、 'join 'あなたが今やっているように、 'select(" users.name as user_name ")'のように、必要なフィールドに手動で 'select'を実行してリバインドすると、必要な部分にアクセスできるはずです。 – octopushugs

+0

レールアソシエーションが期待どおりにロードされていないという根本的な問題はありますか?あなたのSQLスキーマが正しく設定されていない可能性がありますか?ユーザーオブジェクトをロードして、 omのコンソール? ( 'bin/rails console'を実行してコンソールに入ります)。レールコンソールからは、さまざまなモデルやアソシエーションを構築して、期待どおりにすべてがデータベースに保存されていることをテストできるはずです。 – Puhlze