使用before_create我創建一個標籤系統目前位置後的has_many:標籤:通過=>:tag_joins在Rails3中
現在當一個新的標籤創建,一個連接會自動創建,連接標籤並在後面創建標籤。問題是我想使用before_create來檢查是否已經創建了具有相同名稱和用戶標識的標籤。如果它已經被創建,我想讓連接使用原始標記ID,而不是讓它創建一個新的標記ID。
有關如何完成此任務的任何提示?
使用before_create我創建一個標籤系統目前位置後的has_many:標籤:通過=>:tag_joins在Rails3中
現在當一個新的標籤創建,一個連接會自動創建,連接標籤並在後面創建標籤。問題是我想使用before_create來檢查是否已經創建了具有相同名稱和用戶標識的標籤。如果它已經被創建,我想讓連接使用原始標記ID,而不是讓它創建一個新的標記ID。
有關如何完成此任務的任何提示?
您不能在您的模型中使用:before_save
運行私有方法嗎?
如果你把這樣的代碼:
:before_save :method_to_check_something
...你將能夠運行在模型驗證的任何方式沒有得到所涉及的控制器(從而秉承瘦控制器,脂肪模型方法)。
我不明白before_save會如何工作?如果重複項已存在,我不希望創建標籤。事後關於連接表不保存種類? – Elliot 2011-02-12 15:17:29
爲什麼不使用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
這應該照顧之間的重複記錄郵政和標籤,但不知道如何與用戶建立關聯。
class Post < ActiveRecord::Base
has_many :tags, :through => :tag_joins, :uniq => true
end
我只是好奇,標準的Rails約定將命名連接表'posts_tags'。你只是不喜歡這個名字?除了post_id和tag_id之外,表中還有其他字段嗎?我無法想象會發生什麼。 – 2011-02-12 15:47:19
請參閱我的更新。 – dombesz 2011-02-13 00:03:30