2011-02-15 54 views
2

我有3種型號:帳戶,討論和標籤(由is_taggable提供)你如何在Rails 3中組織一個有很多貫穿的關係?

class Account 
    has_many :discussions 
end 

class Discussion 
    belongs_to :account 
    has_many :tags 

    is_taggable 
end 

我希望能夠做current_account.tags,列出所有當前正在使用的帳戶的討論的標籤。所以......

class Account 
    has_many :discussions 
    has_many :tags, :through => :discussions, :source => :taggings 
end 

注:源的Tagging是聯接表is_taggable用途加入標籤,您可加標籤模型(討論,在這種情況下...)

與離開這個問題HM:通過這種方式,在不同的討論中多次出現相同的標籤會強制它們在這個關聯中出現相同的次數。所以,我想:「沒問題,我會組此關聯的引用的Tagging表的TAG_ID,所以每個標籤只有一次出現了。

class Account 
    has_many :discussions 
    has_many :tags, :through => :discussions, :source => :taggings, :group => "taggings.tag_id" 
end 

這是不行的,這產生了SQL的進一步檢查顯示羣組BY沒有出現在SQL我的問題,我怎麼得到這個工作

其他有些事情我想:?

  • 製作實例方法,「標籤」。雖然這回我結果設置正確,它不是一個AR收藏,所以我無法如此操作它(也許有人知道如何正確地做到這一點?)
  • 使用:unique => true選項。聽起來像是會起作用,但由於我們正在採購:標籤表,這就是它試圖使其唯一,並且該表中的所有條目都是唯一的(tag_id + taggable_id [我們的討論]),所以沒有任何變化。

在此先感謝您提供任何幫助,並對任何與iPad相關的錯別字致歉。

+0

這對您有幫助嗎? http://stackoverflow.com/questions/2061389/named-scope-in​​-rails-unique-records - 我還沒有遇到像你一樣的需求,所以只是幫助研究。 – Steve 2011-02-15 01:45:06

回答

1

使用的標籤,比如這個名爲範圍:

scope :account, lambda { |account| 
    select('DISTINCT taggings.*'). 
    join('discussions on discussions.id = taggings.discussion_id'). 
    where("discussions.account_id = ?", account.id) 
} 

然後,只是把它作爲:

Tags.account(current_account) 

而且你會回來的AR集合。您也可以在您的帳戶模型中添加一個方法,在自己的標籤中將其稱爲該範圍,如:

def tags. 
    Tags.account(self) 
end