2011-02-12 47 views
0

使用before_create我創建一個標籤系統目前位置後的has_many:標籤:通過=>:tag_joins在Rails3中

現在當一個新的標籤創建,一個連接會自動創建,連接標籤並在後面創建標籤。問題是我想使用before_create來檢查是否已經創建了具有相同名稱和用戶標識的標籤。如果它已經被創建,我想讓連接使用原始標記ID,而不是讓它創建一個新的標記ID。

有關如何完成此任務的任何提示?

+0

我只是好奇,標準的Rails約定將命名連接表'posts_tags'。你只是不喜歡這個名字?除了post_id和tag_id之外,表中還有其他字段嗎?我無法想象會發生什麼。 – 2011-02-12 15:47:19

+0

請參閱我的更新。 – dombesz 2011-02-13 00:03:30

回答

1

您不能在您的模型中使用:before_save運行私有方法嗎?

如果你把這樣的代碼:

:before_save :method_to_check_something 

...你將能夠運行在模型驗證的任何方式沒有得到所涉及的控制器(從而秉承瘦控制器,脂肪模型方法)。

+0

我不明白before_save會如何工作?如果重複項已存在,我不希望創建標籤。事後關於連接表不保存種類? – Elliot 2011-02-12 15:17:29

2

爲什麼不使用find_or_create_by_user_id_and_tag_id()find_or_initialize_by_

更新

所以,如果你想避免創建重複的標籤,你可以使用:

@post.tags.find_or_create_by_name('tag_name') 

,或者如果你想保存新對象之前應用了一些變化,然後使用

@post.tags.find_or_initialize_by_name('tag_name') 

在這兩種情況下,name屬性都將被設置爲'tag_name' 默認。

所以這個方法會返回你的標籤,如果存在,否則創建它,所以你可以在設置你的連接模型時使用它。

更新2

這實際上不符合的has_many要去工作:通過,你可以看到一個類似的問題,在這裏解決方法: Error while using `find_or_create_by` on a `has_many` `through` association

0

這應該照顧之間的重複記錄郵政和標籤,但不知道如何與用戶建立關聯。

class Post < ActiveRecord::Base 
    has_many :tags, :through => :tag_joins, :uniq => true 
end