ユーザーが 3 つの異なるモデルの属性に基づいて特定のリンクを検索できる高度な検索オプションをアプリに追加しようとしています。
私のアプリは、User has_many :websites
、Website has_many :links
、およびLink has_many :stats
Railsで結合やインクルードなどを使用してSQLクエリを作成する方法は知っていますが、すべてではなく各リンクの最新の統計情報のみを取得したいので、行き詰まっています-これを行う最も効率的な方法がわかりません.
たとえば、ユーザーが 2 つの Web サイトを持ち、それぞれに 10 個のリンクがあり、各リンクに 100 個の統計があり、合計で 2,022 個のオブジェクトがあるとしますが、42 個のオブジェクト (リンクごとに 1 個の統計のみ) のみを検索したいとします。
データベース クエリでこれら 42 個のオブジェクトのみを取得する.where("attribute like ?", user_input)
と、正しいリンクを追加して返すことができます。
アップデート
Link モデルに以下を追加しようとしました。
has_many :stats, dependent: :destroy
has_many :one_stat, class_name: "Stat", order: "id ASC", limit: 1
しかし、これはうまくいかないようです。たとえば、次のようにします。
@links = Link.includes(:one_stat).all
@links.each do |l|
puts l.one_stat.size
end
取得する代わりに1, 1, 1...
、すべての統計の数を取得します: 125, 40, 76...
。
limit オプションを使用して希望する結果を得ることができますか、それともうまくいきませんか?
2回目の更新
Erez のアドバイスに従ってコードを更新しましたが、まだ正しく動作していません。
has_one :latest_stat, class_name: "Stat", order: "id ASC"
@links = Link.includes(:latest_stat)
@links.each do |l|
puts l.latest_stat.indexed
end
=> true
=> true
=> true
=> false
=> true
=> true
=> true
Link.includes(:latest_stat).where("stats.indexed = ?", false).count
=> 6
Link.includes(:latest_stat).where("stats.indexed = ?", true).count
=> 7
1 と 6 を返す必要がありますが、最新の統計だけでなく、すべての統計をチェックしています。