我是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)
查看作用域和/或类方法,您可以使用它们来封装查询并使它们可链接以获得很大的灵活性。希望这对你有所帮助。