如何使用复合关联键?

时间:2015-08-26 12:18:45

标签: ruby-on-rails ruby-on-rails-4

我将外键用于关联模型,但是名称冲突

模型:

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 / tasks / 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数据:populate_polls rake aborted!   ActiveRecord :: RecordNotUnique:PG :: UniqueViolation:ОШИБКА:   更多信息,请访问   “statuses_pkey”详情:Ключ“(id)=(0)”ужесуществует。 : 插入   “状态”(“id”,“title”)VALUES($ 1,$ 2)返回“id”

但我没有使用状态。我使用status_poll_id

1 个答案:

答案 0 :(得分:0)

关键是:INSERT INTO&#34;状态&#34; (&#34; id&#34;,&#34; title&#34;)VALUES($ 1,$ 2)返回&#34; id&#34;

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

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