我是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
但它们是一个问题,在这种情况下,我可以只根据一个标签搜索书签,但我想在多个标签的基础上进行搜索。我该如何实现呢?
答案 0 :(得分:0)
如果您已经设置了所有关联(例如has_many :bookmarks, :through => :taggings
上的Tag
,或者根据书签和标签的含义最合适的关联),您应该可以打电话#bookmarks
的任何实例上的Tag
。防爆。 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)
查看范围和/或类方法,您可以使用它们来封装查询并使它们可链接以获得很大的灵活性。希望这可以帮助。