Witam
Chciałbym stworzyć tabelę w RoR, która by miała:
- Klucz podstawowy inny niż id (nr, niby to samo z funkcjonalności, ale chciałbym by inaczej się nazywało)
- 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)
);