私は、次のモデルがあります:Railsの複数のINNER JOINはhas_many関係ですか?
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;
私はImage.find(34)を引き起こす画像に
has_many :tags, :through => :gallery_tags, :foreign_key => :gallery_id
を追加しようとしました
をもたらすことが.tagsSELECT `tags`.* FROM `tags` INNER JOIN `gallery_tags` ON `tags`.id = `gallery_tags`.tag_id WHERE ((`gallery_tags`.gallery_id = 34))
(これは画像のgallery_idをクエリに使用していません)、次に私は
を追加しようとしましたUser.findは、(1)だから、ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection macro :has_many :through for has_many :bookmarked_tags, :through => :bookmarked_images. Use :source to specify the source reflection.
をもたらすことが.bookmarked_tagsなり、ユーザーへ
has_many :bookmarked_tags, :through => :bookmarked_images, :source => :tags
:どのように私はUser.find(1)で掲示クエリを実行するためのRailsを得ることができます。 bookmarked_tags?
うわー、面白いに
bookmarked_tags
メソッドを追加することができます。私は方法が必要だと思ったが、私はArelの.joinsを使ったことはなかった。ありがとう、これは動作します(私は2番目の解決策に行きました)。 –