У меня есть следующие модели:
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
to 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 для has_many
: bookmarked_tags,: through =>: bookmarked_images. Использование: источник для
укажите источник отражения.
Итак: как я могу заставить Rails выполнить запрос, который я отправил с помощью User.find (1) .bookmarked_tags?