2011-10-10 53 views
0

假設我有帖子,通過分類有許多類別。假設我添加了一個布爾列primarycategorizations以確定帖子的主要類別。但現在我被困對付加入模型中,當我真正想要做的是這樣的:有沒有辦法將方法委託給「主動」連接模型?

post = Post.first 
primary_cat = post.categories.where(:primary => true) 

post.categories.first.primary = true 
post.save # would actually update the categorization, setting primary = true 

還有的例子種種,我可以給你展示爲什麼這將是有益的,但基本上我希望能夠與模型進行交互,就好像它以某種方式與其連接模型合併。能夠說「什麼是主要類別?」或者「確定這個類別將成爲主要類別」,而不需要觸及連接模型,這對我來說是直觀的。

這甚至可能與Rails?有沒有人看過以前做過這樣的事情?

回答

1

我喜歡任務的解決方案,除了設置它應該只是post.primary_category=,並應採取類別對象。只需在帖子上設置一個has_one :primary_category,你就是金。

+0

儘管我同意setter應該在那裏,但它不會在聯接模型和帖子上保存活動狀態,這可能是有用的後來。 – quest

-1

這個問題可能是Ruby on Rails: attr_accessor for submodels的一個副本,但基本上delegate應該是你要找的東西,還有一個額外的保存回調。

+0

我對代表非常熟悉,我不明白它是如何完成我期待的。給定的類別有很多分類。我如何知道要分配哪個分類? – steve

+0

哦,對不起,我錯誤地解釋了你的問題 – riffraff

1

簡短的答案是在類別上創建一個set_primary(post)方法,該方法以參數post和boolean爲參數。

def set_primary(post) 
    categorization = post.categorization.where('your opts hash here') 
    categorization.primary = true 
    categorization.save! 
end 


post.categories.first.set_primary(post) 
+0

是的,這有點解決了這個問題,但只有一方面。我試圖看看是否存在更全面/整體的解決方案。 – steve

1

查理鮑曼不具有對分類模型set_primary邏輯第一塊拼圖,但是他的二傳手不取消之前的活動範疇。另外,史蒂夫的問題昂貴的部分,實際上只是獲取每個請求的主要類別。爲了解決這個問題,我還會在郵件本身上保存主類別ID。這樣你就不需要訪問連接模型來找出主要的類別。

def set_primary_category(post) 
    post.categorizations.each do |cat| 
    if cat.post == post 
     cat.primary = true 
     cat.save! 
     post.update_attribute(:primary_category_id, cat.category_id) 
    else 
     cat.update_attribute(:primary, false) if cat.primary 
    end 
    end 
end 

要設置:

post.categories.first.set_primary(post) 

來訪問:

post.primary_category 

不幸的是,我不認爲任何人作出了寶石,使這個您更輕鬆地完成,但邏輯非常簡單。它還具有在分類和帖子中訪問主要狀態的好處,因此您始終可以快速訪問數據。

另外,我認爲它很好記。您對帖子/類別擁有多對多的關係。但是對於post/primary_category只有一個關係。只要你有這樣的訪問模式,我喜歡嘗試並遠離has_one的連接模型,因爲它不是必需的。

+0

你可能也想看看關聯方法,他們可能會完成你所需要的。舊學校,但仍然有用。 HTTP:// ryandaigle。com/articles/2006/12/3/extend-your-activerecord-association-methods – quest

相關問題