0

関係は次のとおりです。今Rails 4ネストされたhas_many where where where節付き

Client -> has_many :analytics 
Client -> has_many :metrics, through: :analytics 
Analytic -> has_many :metrics 

私はこのエラーが出るように私は単にClient.find(1).analytics.where(condition).metricsを行うことはできません。

undefined method `metrics' for #<Analytic::ActiveRecord_AssociationRelation:0x00000002e31a50> 

私が見つけた私は何をすることができますが、以下が、それは非常にレールの道をかさばるようで、ではありません

analytics = client.analytics.where(conditions).select(:id) 
metrics = Metric.where(analytic_id: analytics) 

私は上記のようにもっと合理的な方法で一緒にチェーン化する方法はありますか?

答えて

0

最終的にはmetricsが欲しいと思われるので、そこから始めてください。

関連の条件も照会する必要があります。

あなたの条件に照会するために関連付けに参加してください。私たちは、クエリは、よりエレガントにすることができると思います

metrics = Metric.joins(analytic: [:client]).where(analytic:{ conditions, client_id: client }) 

編集

はこのような何かを試してみてください。

私の頭の上から出てきて、これが動作すれば教えてください。

client = Client.find(1) 
metrics = client.metrics.joins(:analytic).where(analytics: {conditions}) 
+0

ありがとうございました。以前は私が試みたよりはるかにエレガントであったが、確かにより読みやすい。両方のソリューションは2つのSQL演算を行います( 'select 'と' select in 'と' select'と 'join')。 – Killerpixler

+0

@Killerpixlerは答えを更新しました – fbelanger

+0

' has_many through' associatonのおかげで、クライアントの結合が必要な場合でも 'c = Client.find(1)'で 'm = c.metrics.joins(:analytic).where(analytics:{cond})' – Killerpixler