0

我對Rails比較陌生,爲了學習更多,我試圖構建一個簡單的博客。我正在運行的一個問題是標記。我有一個Tag模型,用於創建和管理可應用於帖子的標籤。我也有一個Post模型。我需要能夠將任何標籤與帖子相關聯,檢索它們以輸出,並且能夠通過特定標籤過濾/查詢帖子。Rails通過記錄協會查詢

到目前爲止,我在Post上創建了一個名爲tags的列,該列被分配了一個Tag ID的數組,然後被序列化。這對於檢索很有用,但我的理解是,試圖通過序列化列查詢記錄是big no-no

正如上面的鏈接推薦,我這樣做,以實現我的過濾器:

Post.all.select { |post| post.tags.include? 3 } 

但我知道,這是收集所有我的職位,然後使用數組方法select過濾通過他們。

我的問題是:如何將Tag記錄與Post記錄相關聯,並通過給定標籤查詢/過濾記錄記錄?

回答

0

因此,讓我們假設你的模型是這樣的:

class Post < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, through: :taggings 
end 

class Taggings < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :posts, through: :taggings 
end 

所以引用的Tagging是加盟模式,讓您在使用標籤和帖子很多-to-many關聯。

在這一點上,添加標籤後是簡單的:

post.tags << Tag.create(name: 'foo') 

您可以通過活動記錄查詢此,通過在這裏使用嵌套的哈希值。

Post.joins(:tags).where(tags: { name: 'foo' }) 

請記住,此處的標記是我們在模型中聲明的關係的名稱,而不是實際的基礎表。那麼,這實際上要做的是運行SQL,看起來像

select * from posts 
inner join taggings on taggings.post_id = posts.id 
inner join tags on taggings.tag_id = tag.id 
where tags.name = 'foo'; 

既然我們已經聲明瞭表是如何在模型相關,導軌知道它必須聯合起來,查詢標籤與上面的代碼。

+0

對不起,這花了這麼長時間。工作完美!謝謝! –