【问题标题】:Specify a foreign key in Sequel model在 Sequel 模型中指定外键
【发布时间】:2015-01-22 14:14:43
【问题描述】:

我有两个模型:

富:

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

加载 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'

在我的 Sequel 模型中指定外键的正确方法是什么?

** 编辑 **

使用 MySQL2。

【问题讨论】:

  • 您需要设置表的架构以获得适当的帮助。

标签: mysql ruby sequel sequel-gem


【解决方案1】:

一般来说你想看the options for associations。具体来说,您需要告诉 Sequel 如何在给定 foo 的情况下找到正确的“bars”。

如果您只是在 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"}>

【讨论】:

  • 谢谢。真的很有帮助。
  • 我的荣幸。虽然我非常感谢您将您的问题简化为通用名称,但将来请务必展示这些名称如何映射到所涉及表的实际架构。
  • 关于显示架构的最佳方式有什么建议吗?我怀疑 SO 是否支持 graphviz。
  • 如果您使用的是 Postgres,我建议在所涉及的表上使用 \dt。我不知道 MySQL2 中的等价物。或者,您可以使用 DB.schema(:TABLENAME) 为每个表显示 Sequel 理解的架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多