【发布时间】:2011-10-30 19:45:20
【问题描述】:
我有以下型号:
class Image < ActiveRecord::Base
belongs_to :gallery
has_many :bookmarks
has_many :gallery_tags, :foreign_key => :gallery_id
end
class Bookmark < ActiveRecord::Base
belongs_to :user
belongs_to :image
has_many :gallery_tags, :through => :image, :source => :gallery_tags
end
class GalleryTag < ActiveRecord::Base
belongs_to :gallery
belongs_to :tag
end
class Gallery < ActiveRecord::Base
belongs_to :provider
has_many :images
belongs_to :user
has_many :gallery_tags
has_many :tags, :through => :gallery_tags
end
class Tag < ActiveRecord::Base
end
class User < ActiveRecord::Base
has_many :bookmarks
has_many :galleries
end
我希望能够做到
User.find(1).bookmarked_tags
并通过与图像关联的画廊检索与所有用户的书签图像关联的所有标签。标签与画廊相关联。
查询最终会如下所示:
SELECT
tags.*
FROM
tags
INNER JOIN gallery_tags ON gallery_tags.tag_id = tags.id
INNER JOIN images ON gallery_tags.gallery_id = images.gallery_id
INNER JOIN bookmarks ON images.id = bookmarks.image_id
WHERE
bookmarks.user_id = 1
GROUP BY
tags.id;
我已经尝试添加
has_many :tags, :through => :gallery_tags, :foreign_key => :gallery_id
到Image,这会导致Image.find(34).tags导致
SELECT `tags`.* FROM `tags` INNER JOIN `gallery_tags` ON `tags`.id = `gallery_tags`.tag_id WHERE ((`gallery_tags`.gallery_id = 34))
(它没有在查询中使用图片的gallery_id),然后我尝试添加
has_many :bookmarked_tags, :through => :bookmarked_images, :source => :tags
到用户,这导致 User.find(1).bookmarked_tags 导致
ActiveRecord::HasManyThroughSourceAssociationMacroError: 无效 源反射宏 :has_many :through for has_many :bookmarked_tags, :through => :bookmarked_images。使用 :source 到 指定源反射。
那么:如何让 Rails 运行我使用 User.find(1).bookmarked_tags 发布的查询?
【问题讨论】:
标签: ruby-on-rails-3 activerecord