2016-05-20 3 views
-2

私は4テーブルを持っていますusersuser_detailscategoriesおよびgalleriesすべてのレコードを1つのクエリで表示したいと思います。私のテーブル構造の下を参照してくださいRuby on Railsで2つ以上のテーブルに参加するには?

カテゴリ

id 
name 

ユーザー

id 
username 
email 
password 
user_type 
is_active (0 or 1) 
created_at 
modified_at 

user_details

id 
user_id 
category_id 
name 
gender 
address 
phone 

ギャラリー

id 
user_id 
name 
image 
is_active 

私は、ユーザID = user_detailsとカテゴリと1とgalleriesテーブルからの彼女/彼女のすべてのis_active = 1の画像を表示するが、ここで

があるすべてのユーザー情報を取得したい私コード - ここ

@user_details = User.eager_load(:Category,:Gallery,:UserDetail).where('users.id'=>20, 'users.is_active'=>1, 'users.user_type'=>2, 'galleries.is_active'=>1).first() 

私は取得していますエラーメッセージ:

Association named 'Category' was not found on User; perhaps you misspelled it? 

実際には、私はUserDetailsモデルにCategoryを関連付けました。だから私はCategoryデータを取得することができません。私のすべてのモデルを見てください -

category.rb

class Category < ActiveRecord::Base 
    has_many :UserDetail 
end 

user.rb

class User < ActiveRecord::Base 
    #before_save :encrypt_password 
    has_one :UserDetail, dependent: :destroy 
    has_many :Gallery, dependent: :destroy 
end 

user_detail.rb

class UserDetail < ActiveRecord::Base 
    belongs_to :User 
    belongs_to :Category 
end 

gallery.rb

class Gallery < ActiveRecord::Base 
    belongs_to :User 
end 

categories表が参加していない理由を私に教えてください。この質問に対して私を助けてください。

+1

のようなもの:それはhas_manyのあるべきUserDetail:user_details – Thorin

+0

いいえ、私のモデルアソシエーションは問題ありません。また、 'UserDetail'は私のためにうまく動作します。 – Chinmay235

答えて

0

ここにいくつかあります。急いでいたので、構文を確認することができませんでしたが、

  1. 適切協会の命名あなたはかなり近づく必要があります - 慣例により組合がモデルの単数または複数の小文字のsnake_caseでなければなりません。だから、ギャラリーは

    クラスギャラリー belongs_toのする必要があります。ユーザー

    クラスのユーザー にhas_many:ギャラリー

  2. 使用して値をロードし、予防するために含まれるN + 1は(

    User.includesを照会します。カテゴリ、:user_detail、、:user_detail)

  3. 条件にスコープを使用する @user_details = User.eager => 20、 'users.is_active' => 1、 'users.user_type' => 2、 'galleries.is_active' => 1)_load(:Category、:Gallery、:UserDetail) 1次回()

    クラスユーザ 範囲:アクティブ、 - > {(is_active:1)} クラス:of_type、 - >(ID){ここで、(USER_TYPE:ID)}

そして、より多くのあなたは、このようにhas_manyの関連付けを定義している理由

User.active.of_type(2).includes(:categories, :user_detail, ,:user_detail, :galleries).where('galleries.is_active'=>1).first() 
関連する問題