2013-05-02 3 views
0

соответствующие таблицы базы данных имеют следующие схемы:Rails пользовательских внешний ключ не соблюдаются

sqlite> .schema structures 
CREATE TABLE structures(
     struct_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
     batch_id INTEGER, 
     tag TEXT, 
     input_tag TEXT, 
     FOREIGN KEY (batch_id) REFERENCES batches(batch_id) DEFERRABLE INITIALLY DEFERRED); 
sqlite> .schema residues 
CREATE TABLE residues(
     struct_id INTEGER NOT NULL, 
     resNum INTEGER NOT NULL, 
     name3 TEXT NOT NULL, 
     res_type TEXT NOT NULL, 
     FOREIGN KEY (struct_id) REFERENCES structures(struct_id) DEFERRABLE INITIALLY DEFERRED, 
     PRIMARY KEY (struct_id, resNum)); 

У меня есть следующие модели:

class Structure < ActiveRecord::Base 
    set_table_name "structures" 
    self.primary_key = "struct_id" 

    attr_accessible :struct_id, :batch_id, :input_tag 

    has_many :residues 
end 

class Residue < ActiveRecord::Base 
    self.primary_keys :struct_id, :resnum 
    belongs_to :structure, :foreign_key => 'struct_id' 
    attr_accessible :name3, :res_type, :resnum 
end 

В структурах показать, что я есть:

<h2>Residues</h2> 
<% @structure.residues.each do |residue| %> 
    <p> 
    <b>Residue number:</b> 
    <%= residue.resnum %> 
    </p> 

    <p> 
    <b>Residue type:</b> 
    <%= residue.res_type %> 
    </p> 
<% end %> 

Однако, когда я пытаюсь показать структуру, я получаю следующую ошибку:

SQLite3::SQLException: no such column: residues.structure_id 

Зачем искать struct_id в базе данных, а не struct_id? Кажется, мой внешний ключ не соблюдается.

ответ

1

Необходимо указать внешний ключ по обе стороны от отношения (has_many и own_to)

+0

Спасибо! Это кажется глупым, не должен ли внешний ключ соответствовать первому ключу другой таблицы? – TimmyJ

+0

. И has_many, и own_to нужно согласовать, на что вызывается имя столбца на вычетах - AR не определяет, какова обратная связь –