我在Rails3的ActiveRecord中设置了以下结构
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在我的控制器中的某个地方,我想从基于某个标签的视频中找到其他视频,使用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)部件,它就能正常工作...我确定这是一些简单的东西,我只是没有看到:)
发布于 2012-03-12 17:27:30
看起来视频查询是有效的,但是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有效。
https://stackoverflow.com/questions/9299433
复制相似问题