Rails的手柄连接表UniqueViolation

问题描述:

我试图插入行的连接表中,我创建了这个迁移(时间戳):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

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

按照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