2014-09-03 40 views
1

我試圖插入行的連接表中,我創建了這個遷移(時間戳):Rails的手柄連接表UniqueViolation

class CreateUserNewsItemJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :users, :news_items do |t| 
     t.timestamps 
    end 

    add_index :news_items_users, [:user_id, :news_item_id], unique: true 
    end 
end 

我這是怎麼插入NewsItem到用戶:

@user.news_items << @news_item 

第一次,插入成功。但是如果我再次插入相同的記錄,它將顯示UniqueViolation。

如何使相同的插入,更新時間戳,而不是拋出UniqueViolation錯誤?

+0

你正在嘗試做的* UPSERT *。這不像你想象的那麼簡單。對於一些非Rails特定的信息,請參閱http://stackoverflow.com/q/17267417/398670 – 2014-09-03 09:39:35

回答

2

你不想再次插入,你想更新連接表。

按照rails guides如果你需要在所有的連接表的工作,它應該有它自己的模式:

拇指的簡單規則是,你應該建立一個的has_many :通過關係如果您需要使用關係模型 作爲獨立實體。如果您不需要對 關係模型執行任何操作,則可能會更簡單地設置has_and_belongs_to_many關係(儘管您需要記住 以在數據庫中創建連接表)。

因此,創建模型並使用has_many_through。

然後您就能夠做到:

item = UserNewsItem.find_by(news_id: x, user: y) 
item.update_attribute(:updated_at, Time.now) 
+0

謝謝,我最終創建了一個模型,就像您的建議。但我用這個: read = Read.find_or_initialize_by(:user_id => @ user.id,:news_item_id => news_item.id).update_attributes(:updated_at => Time.now) – VHanded 2014-09-04 02:17:28