2015-01-22 4 views
0

У меня есть две модели:Укажите внешний ключ в Sequel модели

Foo:

class Foo < Sequel::Model (:FOO_TABLE) 

    set_primary_key [:KEY] 

    # has many Bars 
    one_to_many :bars 

end 

Бар:

class Bar < Sequel::Model (:BAR_TABLE) 

    # compound key 
    set_primary_key [:KEY,:NBR] 

    # belongs to Foo 
    many_to_one :foo 

end 

Loading Foo работает, как ожидалось:

irb> foo = Foo['ABC'] 
=> #<Foo @values={:KEY=>"ABC", :NAME=>"ABC name"}> 

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

irb> bars = foo.bars 
=> Sequel::DatabaseError: Mysql2::Error: Unknown column 'BAR_TABLE.foo_id' in 'where clause' 

Что такое правильный способ указать foreign_key в моей Sequel модели?

** Редактирование **

Использование MySQL2.

+0

Вы должны ставить схема ваших таблиц для правильной помощи. – Phrogz

ответ

1

В общем, вы хотите посмотреть на the options for associations. В частности, вам нужно сказать Sequel, как найти правильные «бары», заданные foo.

Если вы используете только нестандартное имя внешнего ключа ссылки в вашем BAR_TABLE, вы можете сделать это:

class Foo < Sequel::Model(:BAR_TABLE) 
    one_to_many :bars, :key => :my_foo_id 
end 

class Bar < Sequel::Model(:BAR_TABLE) 
    many_to_one :foo, :key => :my_foo_id 
end 

Пример/доказательство:

require 'sequel' 
DB = Sequel.sqlite 
DB.create_table(:FOOBOY){ Integer :myd; String :name; primary_key [:myd] } 
DB.create_table(:BARSTON){ Integer :myd; String :name; foreign_key :my_foo_id, :FOOBOY; primary_key [:myd] } 

DB[:FOOBOY] << { myd:1, name:'Furst' } 
DB[:FOOBOY] << { myd:2, name:'Surkind' } 

DB[:BARSTON] << { myd:1, name:'Bobby', my_foo_id:1 } 
DB[:BARSTON] << { myd:2, name:'Jimmy', my_foo_id:1 } 
DB[:BARSTON] << { myd:3, name:'XYZZY', my_foo_id:2 } 

class Foo < Sequel::Model(:FOOBOY) 
    one_to_many :bars, :key => :my_foo_id 
end 

class Bar < Sequel::Model(:BARSTON) 
    many_to_one :foo, :key => :my_foo_id 
end 

Foo[1] 
#=> #<Foo @values={:myd=>1, :name=>"Furst"}> 

Foo[1].bars 
#=> [#<Bar @values={:myd=>1, :name=>"Bobby", :my_foo_id=>1}>, #<Bar @values={:myd=>2, :name=>"Jimmy", :my_foo_id=>1}>] 

Foo[1].bars.last.foo 
#=> #<Foo @values={:myd=>1, :name=>"Furst"}> 

Bar.last 
#=> #<Bar @values={:myd=>3, :name=>"XYZZY", :my_foo_id=>2}> 

Bar.last.foo 
#=> #<Foo @values={:myd=>2, :name=>"Surkind"}> 
+0

Спасибо. Действительно полезно. – craig

+0

Мое удовольствие. Хотя я действительно ценю, что вы оцениваете свой вопрос до общих имен, в будущем, пожалуйста, не забудьте показать, как они сопоставляются с фактической схемой используемых таблиц. – Phrogz

+0

Любые рекомендации по наилучшему способу отображения схемы? Я сомневаюсь, что SO поддерживает graphviz. – craig