根据标签从数据库中获取书签



我是Rails新手,我在应用程序中有3个模型,即Bookmark, Tag, Tagging。我想根据标签获取所有的书签。

模型的属性为:

书签:id, name

标签:id, name

标签:bookmark_id, tag_id

模型间关联:

bookmark.rb

has_many :taggings
has_many :tags, through: :taggings

tag.rb

has_many :taggings
has_many :bookmarks, through: :taggings

tagging.rb

belongs_to :tag
belongs_to :bookmark

获取书签的方法是:

Tag.find(id).bookmarks

,但他们的一个问题是,在这种情况下,我可以搜索书签的基础上一个标签,但我想搜索的基础上多个标签。我该如何实现呢?

如果您已经设置了所有关联(例如,Tag类上的has_many :bookmarks, :through => :taggings,或者基于书签和标签的任何关联最有意义),您应该能够在Tag的任何实例上调用#bookmarks。例如,Tag.find(1).bookmarks将返回标签连接表中与该标签配对的所有书签。

如果你还没有阅读http://guides.rubyonrails.org/association_basics.html,我将从阅读开始。然后查看http://guides.rubyonrails.org/active_record_querying.html,它向您展示了如何使用ActiveRecord::QueryMethods和它们生成的SQL。

根据您的后续问题编辑:

假设您有一个包含三个标签id的数组:

tag_ids = [1, 2, 3]
tags = Tag.find(tag_ids)
tags.map(&:bookmarks)

如果你想要一个更灵活的查询,你可以这样做:

Tag.where("tags.id IN (?)", tag_ids).joins(:taggings => :bookmark)

现在,如果您只想要最近一个月内创建的书签,您可以这样做:

Tag.where("tags.id IN (?)", tag_ids).joins(:taggings => :bookmark).where("bookmarks.created_at >= ?", 1.month.ago)

查看作用域和/或类方法,您可以使用它们来封装查询并使它们可链接以获得很大的灵活性。希望这对你有所帮助。

最新更新