Portál AbcLinuxu, 12. května 2025 23:57

Dotaz: Ruby on Rails & Migrations

15.1.2006 17:19 dau | blog: dau | Brno
Ruby on Rails & Migrations
Přečteno: 203×
Odpovědět | Admin

Zdravím, narazil jsem na problém, s nímž si nevím rady. Netuším, zda to způsobují Rails či MySQL, hádám, že spíš to druhé bude pravdou...

Zde uvádím část kódu, který by se měl postarat o vygenerování tabulky. Nutno dodat, že jsem postupoval podle tohoto návodu:

class AddPlanningTable < ActiveRecord::Migration

  def self.up

  	create_table :plans do |table|

  		table.column :treatment_id, :integer, :limit => 10, :default => 0

  		table.column :name, :string

  	end

  	add_index "plans", ["treatment_id"], :name => "fk_plans_treatment"
        execute 'ALTER TABLE plans ADD CONSTRAINT fk_plans_treatment FOREIGN KEY ( treatment_id ) REFERENCES treatments( id )'
                
  end

  def self.down
  	drop_table :plans
  end
end

Po zadání rake migrate se ovšem dozvím následující:

(in /home/dau/development/)
rake aborted!
Mysql::Error: Can't create table './oncosys_dev/#sql-a96_ab.frm' (errno: 150): ALTER TABLE plans ADD CONSTRAINT fk_plans_treatment FOREIGN KEY ( treatment_id ) REFERENCES treatments( id )

Zajímavé je, že to tabulku vytvoří, nicméně Rails na to reagují zmateně a nelze ji pak pomocí Migrations odstranit.

Vše je bez problému jen v případě, že v definici nepoužiji generování cizího klíče - ovšem to je právě to, co nepotřebuji. Cizí klíč v tabulce musí být nutně definován. Stejná chybová hláška se objeví i v případě, že tabulku vygeneruji bez cizího klíče a pak se snažím jej přidat přímo v mysql. Přiznám se, že jsem zmaten a nevím si rady.

Nevíte někdo, co s tím? Bez vyřešení tohoto problému se nemůžu pohnout dál. Ještě bych dodal, že používám Gentoo Linux, MySQL v. 4.0.25, Rails 1.0.0.

Není nic tak legračního, jako nechat ze sebe dělat totálního blbce.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.1.2006 18:03 dau | blog: dau | Brno
Rozbalit Rozbalit vše Re: Ruby on Rails & Migrations
Odpovědět | | Sbalit | Link | Blokovat | Admin

Zahledal jsem na netu, chyba 105 nějakým způsobem opravdu souvisí s generováním cizího klíče, nicméně myslím, že všechny požadavky na indexy mám splněny. Pro pořádek ještě znovu udávám výpis struktury pár tabulek (s omezeným počtem hodnot):

CREATE TABLE machines (
  id tinyint(3) unsigned NOT NULL auto_increment,
  name varchar(50) NOT NULL default '',
  kind_of_machine varchar(5) default NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY name (name)
) TYPE=InnoDB COMMENT='Table of machines';

-- --------------------------------------------------------

CREATE TABLE plans (
  id int(11) NOT NULL auto_increment,
  treatment_id int(10) default '0',
  name varchar(255) default NULL,
  PRIMARY KEY  (id),
  KEY treatment_id (treatment_id)
) TYPE=InnoDB;

-- --------------------------------------------------------

CREATE TABLE treatments (
  id int(10) unsigned NOT NULL auto_increment,
  patient_id int(10) unsigned default '0',
  machine_id tinyint(3) unsigned default '0',
  plan varchar(6) default NULL,
  description varchar(200) default NULL,
  PRIMARY KEY  (id),
  KEY plan (plan),
  KEY machine_id (machine_id),
  KEY patient_id (patient_id)
) TYPE=InnoDB COMMENT='Basic table with treatments';

-- 
-- Omezení pro tabulku `treatments`
-- 
ALTER TABLE `treatments`
  ADD CONSTRAINT `fk_treatments_machine` FOREIGN KEY (`machine_id`) REFERENCES `machines` (`id`),
  ADD CONSTRAINT `fk_treatments_patient` FOREIGN KEY (`patient_id`) REFERENCES `patients` (`id`);

Není nic tak legračního, jako nechat ze sebe dělat totálního blbce.
15.1.2006 18:17 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: Ruby on Rails & Migrations
Ahoj,

pro výpis kódu používej pre tag, code nezachová formátování (opravil jsem ti to).
-- Nezdar není hanbou, hanbou je strach z pokusu.
2.2.2006 11:33 kubicek | Praha
Rozbalit Rozbalit vše Re: Ruby on Rails & Migrations
V tabulce plans musite mit cizi klic treatment_id definovan uplne stejne jako primarni klic tabulky treatments. Tzn: treatment_id int(10) unsigned default '0',

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.