0

を与える私は他のビデオを見つけたいのRails:インナー行為-AS-タグ付けできるオンのfind_related_tagsに参加MySQLエラーに

class Domain < AR 
    has_and_belongs_to_many :videos 
end 

class Video < AR 
    has_and_belongs_to_many :domains 
    acts_as_taggable_on :tags 
    scope :with_state, lambda { |s| where('state = ?', s) } 
end 

Railsの3に私のコントローラ内のどこかをActiveRecordのに設定し、次の構造を持っています特定のタグに基づいたビデオから、find_related_tagsメソッドを使用すると非常に簡単です。しかし、私はcurrent_domainと呼ばれるヘルパーメソッドを介して存在している現在のドメインに関連動画を制限する必要があるので、私は、次のARクエリを思い付いた:

@video = Video.find(params[:id]) 
@video.find_related_tags.joins(:domains).with_state(:converted).where('domains.id = ?', current_domain.id) 

このARクエリは、次のMySQLのクエリが生成します。

SELECT videos.*, COUNT(tags.id) AS count FROM videos, tags, taggings 
INNER JOIN `domains_videos` ON `domains_videos`.`video_id` = `videos`.`id` 
INNER JOIN `domains` ON `domains`.`id` = `domains_videos`.`domain_id` 
WHERE (videos.id != 5 AND videos.id = taggings.taggable_id 
    AND taggings.taggable_type = 'Video' 
    AND taggings.tag_id = tags.id 
    AND tags.name IN ('not')) 
    AND (state = 'converted') 
    AND (domains.id = 4) 
GROUP BY videos.id 
ORDER BY count DESC 

それは私には罰金だが、それはMySQLのエラー生成:

Mysql2::Error: Unknown column 'videos.id' in 'on clause' 

そして、私は取得しないことを! videos.idが不明な列はなぜですか

INNER JOIN `domains_videos` ON `domains_videos`.`video_id` = `videos`.`id` 

すべての結合テーブルが正しく設定されています。すべてが機能します。もし私が.joins(:domains)の部分を削除すれば、それは動作します...それは私が見ていない単純なものだと確信しています:)

答えて

0

MySQLのクエリは有効ですが、videos.idの列は不明の原因ビデオ結合セット内ではなく、FROM句でのみ使用されます。だから私は、次の操作を実行するためのソリューションになってしまった:

Video.find_by_sql(" 
    SELECT videos.*, COUNT(tags.id) AS count 
    FROM videos 
    INNER JOIN domains_videos ON domains_videos.video_id = videos.id 
    INNER JOIN domains ON domains.id = domains_videos.domain_id 
    INNER JOIN taggings ON videos.id = taggings.taggable_id AND taggings.taggable_type = '#{self.class.to_s}' 
    INNER JOIN tags ON taggings.tag_id = tags.id 
    WHERE tags.name IN (#{joined_tags}) 
    AND videos.state = 'converted' 
    AND domains.id = #{domain.id} 
    AND videos.id != #{id} 
    GROUP BY videos.id 
    ORDER BY count DESC 
    LIMIT #{limit} 
") 

すべてが本当に今参加しているので、文は今のMySQLのために有効です。

関連する問題