Rails Handle Join Table UniqueViolation

时间:2014-09-03 09:32:41

标签: ruby-on-rails ruby postgresql upsert

我试图在连接表中插入一行,这是我在此迁移中创建的(带时间戳):

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错误?

1 个答案:

答案 0 :(得分: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)