首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:使用acts-as-taggable on的find_related_tags进行内连接会导致mysql错误

Rails:使用acts-as-taggable on的find_related_tags进行内连接会导致mysql错误
EN

Stack Overflow用户
提问于 2012-02-16 02:53:58
回答 1查看 793关注 0票数 0

我在Rails3的ActiveRecord中设置了以下结构

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
@video = Video.find(params[:id])
@video.find_related_tags.joins(:domains).with_state(:converted).where('domains.id = ?', current_domain.id)

此AR查询生成以下MySQL查询:

代码语言:javascript
复制
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错误:

代码语言:javascript
复制
Mysql2::Error: Unknown column 'videos.id' in 'on clause'

我就不明白了!为什么videos.id是一个未知的专栏

代码语言:javascript
复制
INNER JOIN `domains_videos` ON `domains_videos`.`video_id` = `videos`.`id`

所有连接表都已正确设置。一切正常。如果我移除.joins(:domains)部件,它就能正常工作...我确定这是一些简单的东西,我只是没有看到:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-12 17:27:30

看起来视频查询是有效的,但是videos.id列是未知的,因为视频不在连接集中,而只在FROM子句中使用。因此,我最终得到了解决方案来做以下事情:

代码语言:javascript
复制
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有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9299433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档