2009-06-25 23 views
2

Ruby on Railsは私にとって非常に新しいものです。私は3つの異なるテーブルから列のセットを取得しようとしています。私はSQLビューを使って結果を取得することができたと思っていましたが、Railsでビューを使用する方法を見つけることができませんでした。ここに私のテーブルがあります。 1)ユーザテーブル - >ユーザ名、パスワード、メールアドレス 2)UserDetailsテーブル - >外部キー:user_id、name、address1、cityなど 3)UserWorkDetails - >外部キー:user_id、work address1、workタイプなど複数のテーブルを1対1の関係でレールに結合する方法

これらの3つのテーブルには、1対1の関係があります。したがって、テーブル2はテーブル1に属し、テーブル3はテーブル1にも属します。テーブル1には1つのユーザ詳細と1つのユーザワーク詳細があります。

ジョインを使用して、ユーザーの電子メール、名前、住所1、市区町村、職場住所1、仕事の種類を取得します。

これを処理する最善の方法は何ですか?これはただのテーブルからすべてのフィールドをロードします

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details]) 

:ので、あなたが主テーブルを照会するとき、他のテーブルの両方を含めるオプションを含める:あなたはすぐに使い行わ欲しいものを手に入れる

答えて

2

一度だけクエリが実行されると、すべてのユーザーデータを含むようにオブジェクトで必要な処理を実行できます。

これは十分に簡単で十分であることがわかりました。これにより、ボトルネックがどこにあるかを知るにはあまりに早く最適化していません。しかし

あなたは本当にただ必要なフィールドを使用ロードしたい場合は:私のSQLは、現時点では少し錆びですが

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details], :select => "id, email, name, address1, city, work_address1") 

:選択オプションだけでなく上ActiveRecord::Base find方法を。

-3

User.find(:first, :joins => [:user_work_details, :user_details], :conditions => {:id => id})

私はちょうどあなたがしたいフィールドを選択しようとすると、この時点では時期尚早な最適化ですが、複雑でそれを行うことができることを言うと思います:選択したハッシュ。

:includeは、user_detailsとuser_work_detailsの3つの選択、1つはユーザ、1つはuser_details、もう1つはuser_work_detailsで行います。これは、最小限のクエリで複数のテーブルからオブジェクトのコレクションを選択するのに最適です。

http://apidock.com/rails/ActiveRecord/Base/find/class

4

データがモデルに(ある)です。それ以外のものは単なる最適化です。したがって、address1は例えばuser.user_detail.address1にあります。

あなたは他のすべてはあなたのために行われ、その後user_detailsuser_work_detailsという名前のテーブルの

class User 
    has_one :user_detail 
    has_one :user_work_detail 
end 
class UserDetail 
    belongs_to :user 
end 
class UserWorkDetail 
    belongs_to :user 
end 

user_idの列を持っている場合。 後で最適化する必要がある場合、所有モデルを含めることはできますが、すべてが機能するためには必要ではありません。