我有以下型號:Rails has_many關係中的多個INNER JOIN?
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.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: Invalid source reflection macro :has_many :through for has_many :bookmarked_tags, :through => :bookmarked_images. Use :source to specify the source reflection.
所以:我怎樣才能得到Rails的運行我貼有User.find查詢(1)。 bookmarked_tags?
哇,有意思。我認爲一種方法是必要的,但我從未使用過Arel的.joins。謝謝,這有效(我與第二個解決方案一起)。 –