根据标记

时间:2015-08-14 07:19:30

标签: ruby-on-rails sqlite

我是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

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

1 个答案:

答案 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)

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