ジョインを指定する複数のステートメントを持つようなクエリを作成しようとすると、それぞれにメッセージがチェーンされます。クエリが実行されると、すべての結合が取得されますが、最初の呼び出しの場所のみが取得されます。ここでは、クエリやっている方法のボディです:複数のジョインをレールで連鎖させる
observations_joins = Observation.joins(:obs_session => :project).where(:obs_sessions=>{:project_id=>self.project.id})
descriptor_hash = descriptor_where_hash if tag_descriptors && tag_descriptors.size > 0
puts "The descriptor_hash: #{descriptor_hash}"
observations = observations_joins.joins(:obs_descriptors).where("#{descriptor_hash['query_string']}", descriptor_hash['match_values']) if tag_descriptors && tag_descriptors.size > 0
arel = observations.arel
puts "The arel sql should be: #{arel.to_sql}"
observations
はI第二の内側から呼び出される別の方法が声明に参加し、その潜在的な試合値を反復処理し、文字列と使用する値を生成し、持っています。ここで、本体:
match_values = []
query_string = "obs_descriptors.tag_name = ?"
tag_descriptors.each_index do |index|
query_string = query_string + " #{tag_descriptors.fetch(index).qualifier_key} obs_descriptors.tag_name = ?" if index != 0
match_values << tag_descriptors.fetch(index).tag_name
end
{:match_values=>match_values, :query_string=>query_string}
ように、SQLが生成され得るようなルックス:
SELECT `observations`.* FROM `observations` INNER JOIN `obs_sessions` ON `obs_sessions`.`id` = `observations`.`obs_session_id` INNER JOIN `projects` ON `projects`.`id` = `obs_sessions`.`project_id` INNER JOIN `obs_descriptors` ON `obs_descriptors`.`observation_id` = `observations`.`id` WHERE (`obs_sessions`.`project_id` = 1)
と場所の条件の第2のセットを含んでいません。私はハッシュを印刷して、私の心が失われていないことを確認し、そこに価値があることを確かめるために、実際にそこにある。
私はこれを期待しているようにこれを行うために何が欠けていますか?