オプション 1 (わかりました)
Ruby と ActiveRecord のことですか? ActiveRecord や Rails を使用していますか? #find_by_sql
ActiveRecord内に存在するメソッドです。また、このクエリでは user テーブルは実際には必要ないように見えますが、何かを省略したのではないでしょうか? いずれにせよ、例に含めます。このクエリは、関係を正しく設定していない場合に機能します。
users_trustees = Trustee.
select('trustees.*, ui.image').
joins('LEFT OUTER JOIN users u ON u.id = trustees.trustees_id').
joins('LEFT OUTER JOIN user_info ui ON ui.user_id = t.trustees_id').
where(user_id: user_id, trustee_status: 'pending').
order('t.created DESC')
また、このソリューションではいくつかの点に注意してください。
- 返される ActiveRecord オブジェクトから結合テーブルの列を取得するための非常にエレガントな方法は見つかりませんでした。あなたはそれらにアクセスすることができます
users_trustees.each { |u| u['image'] }
- このクエリはそれほど複雑ではなく、ActiveRecord の関係により、理解と維持がはるかに簡単になります。
- レガシーデータベースを使用していると仮定しているため、列の名前はこのようになっています。私が間違っていて、このアプリ用にこれらのテーブルを作成した場合、主キーが呼び出され
id
、タイムスタンプが and とcreated_at
呼ばれることで、あなたの人生ははるかに簡単になります (そして従来の) updated_at
.
オプション 2 (より良い)
ActiveRecord の関係とクラスを適切に設定すると、このクエリははるかに簡単になります。
class Trustee < ActiveRecord::Base
self.primary_key = 'trustees_id' # wouldn't be needed if the column was id
has_one :user
has_one :user_info
end
class User < ActiveRecord::Base
belongs_to :trustee, foreign_key: 'trustees_id' # relationship can also go the other way
end
class UserInfo < ActiveRecord::Base
self.table_name = 'user_info'
belongs_to :trustee
end
パフォーマンスが最優先事項でない場合、「クエリ」は ActiveRecord の良さになり得ます。Ruby の慣習は、読みやすさを第一に考えており、規模が拡大し始めたら後でコードを再編成します。
受託者のイメージを取得したいとします。
trustee = Trustee.where(trustees_id: 5).first
if trustee
image = trustee.user_info.image
..
end
または、トラスティのすべてのイメージを取得する場合は、次のようにします。
Trustee.all.collect { |t| t.user_info.try(:image) } # using a #try in case user_info is nil
オプション 3 (ベスト)
トラスティは、ある種の特別なケースのユーザーにすぎないようです。さらに単純化するためにテーブルを再構築することを気にしない場合は、STI を使用できます。
これはおそらくこの質問の範囲外なので、これに関するドキュメントにリンクします: http://api.rubyonrails.org/classes/ActiveRecord/Base.html「単一テーブルの継承」を参照してください。Martin Fowler ( http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html )からリンクされている記事も参照してください。
資力
http://guides.rubyonrails.org/association_basics.html
http://guides.rubyonrails.org/active_record_querying.html