2015-08-26 51 views
0

我使用外键关联模型,但得到的名称冲突如何使用复合关联密钥?

型号:

class User < ActiveRecord::Base 
    belongs_to :status 
end 

class Poll < ActiveRecord::Base 
    belongs_to :status_poll 
end 

class Status < ActiveRecord::Base 
    has_many :users 
end 

class StatusPoll < ActiveRecord::Base 
    has_many :polls 
end 

模式:

create_table "polls", force: :cascade do |t| 
t.string "title" 
t.integer "status_poll_id", default: 0 
end 

create_table "status_polls", force: :cascade do |t| 
t.string "title" 
end 

create_table "statuses", force: :cascade do |t| 
t.string "title" 
end 

create_table "users", force: :cascade do |t| 
t.integer "status_id",    default: 0 
t.string "name" 
end 

我试着通过的lib /任务/ data.rake popoulate民调:

namespace :data do 
    task :populate_polls => [:populate_users, :populate_status_polls] do 
    users = User.all.where(status_id: [1, 2]) 

    users.each do |user| 
     polls_quantity = rand(7..21) 
     polls_quantity.times do |n| 
     Poll.create!( 
      title: Faker::Name.title + '_' + user.id.to_s + '_' + n.to_s, 
      user_id: user.id, 
      status_poll_id: rand(0..1), 
      description: Faker::Lorem.paragraph(7) 
     ) 
     end 
    end 
    end 
end 

运行后填充控制台显示跟随误差信息鼠尾草:

kalinin @ kalinin〜/ rails/phs $ rake data:populate_polls rake aborted! ActiveRecord的:: RecordNotUnique:PG :: UniqueViolation:ОШИБКА: повторяющеесязначениеключанарушаетограничениеуникальности “statuses_pkey” DETAIL:Ключ “(ID)=(0)” ужесуществует。 :INSERT INTO “状态”( “ID”, “标题”)VALUES($ 1,$ 2)再次 “ID”

,但我不使用状态。我使用status_poll_id

回答

0

的关键是这样的:INSERT INTO “状态”( “ID”, “标题”)VALUES($ 1,$ 2)再次 “ID”

它告诉你它试图插入一条记录已存在的状态。这可能发生在其中一个子任务中,或者可能是其中的一个子任务。

简而言之,确定记录插入到状态的位置,并找出它试图插入重复记录的原因。