Inny niż id primary key i klucz obcy do samego siebie

Witam
Chciałbym stworzyć tabelę w RoR, która by miała:

  1. Klucz podstawowy inny niż id (nr, niby to samo z funkcjonalności, ale chciałbym by inaczej się nazywało)
  2. klucz obcy do samego siebie

Mam za zadanie pobrać stronę wybodrów prezydenckich, drugiej tury z 2010 roku i zrobić z tego własną stronę, na uczlnię. Co prawda w Django, ale chciałem spróbować swoich sił w RoR, ponieważ wydawało mi się, że to zadanie ma wysokie walory edukacyjne.
Strona to: http://prezydent2010.pkw.gov.pl/PZT/PL/WYN/W/index.htm
W Django mi się udało zrobić to co chciałem. Tutaj do parsowania strony użyłem Nokogiri.
Chcę mieć tabelę
Obwód( nr, nazwa, wynik_kaczynskiego, wynik_komorowskiego, rodzic ) i tabelę Komisja( nr, nazwa, wynik_kaczynskiego, wynik_komorowskiego, obwód, otrzymane_karty_do_głosowania, dopuszczeni_do_głosowania )

W tym celu chiałem zrobić migrację w taki sposób:

class CreateCircuits < ActiveRecord::Migration
  def change
    create_table :circuits, id: false do |t|
      t.primary_key :nr
      t.string :name, null: false
      t.integer :kaczynski_votes, null: false
      t.integer :komorowski_votes, null: false
      t.references :parent, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

Ale jak się łatwo domyślić to nie działa
z modelem

class Circuit < ActiveRecord::Base
  has_many :children, class_name: 'Circuit', foreign_key: 'parent'
  belongs_to :parent, class_name: 'Circuit', foreign_key: 'parent'

  has_many :commissions
  self.primary_key = 'nr'
end

Oczywiście nie znam RoR w żadnym stopniu, ale chciałbym się nauczyć. Rekordy w bazie danych tworzą drzewo, gdzie korzeniem jest cała Polska lub las drzew z korzeniami w województwach

W wyniku chciałbym uzyskać coś jak:

CREATE TABLE circuits (
  nr INTEGER PRIMARY KEY,
  name VARCHAR(64) NOT NULL UNIQUE,
  kaczynski_votes INTEGER NOT NULL CHECK (kaczynski_votes >= 0),
  komorowski_votes INTEGER NOT NULL CHECK (komorowski_votes >= 0),
  father INTEGER REFERENCES circuits('nr')
);

CREATE TABLE commissions (
  nr INTEGER NOT NULL,
  name VARCHAR(64) NOT NULL,
  kaczynski_votes INTEGER NOT NULL CHECK (kaczynski_votes >= 0),
  komorowski_votes INTEGER NOT NULL CHECK (komorowski_votes >= 0),
  circuit INTEGER REFERENCES circuits('nr'),
  allowed_to_vote INTEGER CHECK (allowed_to_vote >= 0 OR allowed_to_vote IS NULL),
  ballots_got INTEGER CHECK (ballots_got >= 0 OR ballots_got IS NULL),

  PRIMARY KEY(nr, circuit)
);

Prościej chyba byłoby zostawić id jako klucz główny i utworzyć dodatkową kolumnę number. Staraj się nie stosować polskich nazw, takich jak nr w bazie danych. Oczywiście jest też możliwość zmiany nazwy klucza głównego, ale jest to trochę upierdliwe rozwiązanie na dłuższą metę. Jeśli Ci coś nie działa, to wklej jakiś komunikat błędu - będzie prościej dojść do przyczyny.

Klucz obcy w rails będzie parent_id nie sam parent dlatwgo prawdopodobnie model nie działa. zamiast belongs_to :parent, class_name: 'Circuit', foreign_key: 'parent' powinno być belongs_to :parent, class_name: 'Circuit', foreign_key: 'parent_id'

I jeszcze w migracji z tego co pamiętam można po prostu podać primary_key: 'nr' zamiast primary_key: false + t.primary_key :nr ale to właściwie szczegół.

Problem będziesz miał w przypadku comissions bo jeżeli chodzi o railsy zwykle się po prostu nei stosuje kluczy kompozytowych bo są cierniem w pupie z wielu powodów. więc wypadało by po prostu dodać unikalny id do tej tabelki.