1

Ruby で複雑なクエリを記述する方法についてアドバイスが必要です。

PHP プロジェクトでクエリを実行します。

    $get_trustee = db_query("SELECT t.trustee_name,t.secret_key,t.trustee_status,t.created,t.user_id,ui.image from trustees t 
                             left join users u on u.id = t.trustees_id
                             left join user_info ui on ui.user_id = t.trustees_id
                             WHERE t.user_id='$user_id' AND trustee_status ='pending'
group by secret_key
ORDER BY t.created DESC")

Rubyでの私の推測:

get_trustee = Trustee.find_by_sql('SELECT t.trustee_name, t.secret_key, t.trustee_status, t.created, t.user_id, ui.image FROM trustees t
        LEFT JOIN users u ON u.id = t.trustees_id
        LEFT JOIN user_info ui ON ui.user_id = t.trustees_id
        WHERE t.user_id = ? AND
              t.trustee_status = ?
        GROUP BY secret_key
              ORDER BY t.created DESC',
              [user_id, 'pending'])
4

2 に答える 2

4

オプション 1 (わかりました)

Ruby と ActiveRecord のことですか? ActiveRecord や Rails を使用していますか? #find_by_sqlActiveRecord内に存在するメソッドです。また、このクエリでは 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')

また、このソリューションではいくつかの点に注意してください。

  1. 返される ActiveRecord オブジェクトから結合テーブルの列を取得するための非常にエレガントな方法は見つかりませんでした。あなたはそれらにアクセスすることができますusers_trustees.each { |u| u['image'] }
  2. このクエリはそれほど複雑ではなく、ActiveRecord の関係により、理解と維持がはるかに簡単になります。
  3. レガシーデータベースを使用していると仮定しているため、列の名前はこのようになっています。私が間違っていて、このアプリ用にこれらのテーブルを作成した場合、主キーが呼び出され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

于 2013-08-19T12:58:11.213 に答える