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错误?
你不想再次插入,你想更新连接表。
按照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)
谢谢,我最终创建了一个模型,就像您的建议。但我用这个: 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
你正在尝试做的* UPSERT *。这不像你想象的那么简单。对于一些非Rails特定的信息,请参阅http://stackoverflow.com/q/17267417/398670 – 2014-09-03 09:39:35