续集one_to_one关联

时间:2014-10-18 04:50:04

标签: ruby sequel

引用Sequel's docs我在职位和公司之间建立了one_to_one关联。

class Position < Sequel::Model
  one_to_one :company
end
class Company < Sequel::Model
  many_to_one :position
end

当我试图让一家公司通过一个职位我没有,虽然我可以找到该公司直接续集查询。

p = Position.first #=> #<Position @values={:id=>1}>
p.company #=> nil
Company.where(position_id: p.id).first #=> #<Company @values={:id=>1, position_id: 1}>

2 个答案:

答案 0 :(得分:1)

您对关系或架构感到困惑。除非你有一个非常具体的商业案例,否则公司有很多职位,这使得一对多的关系和许多职位可以属于一个公司,这就是多对一的。

以下是我的看法:

require 'sqlite3'
require 'sequel'

DB = Sequel.connect('sqlite://companies')

DB.create_table :companies do
  primary_key :id
  String :name
end
DB[:companies].insert(name: 'Acme')

DB.create_table :positions do
  primary_key :id
  String :name
  foreign_key :company_id, :companies
end
DB[:positions].insert(name: 'CEO', company_id: DB[:companies].first[:id])
DB[:positions].insert(name: 'CTO', company_id: DB[:companies].first[:id])

class Company < Sequel::Model
  one_to_many :positions
end

class Position < Sequel::Model
  many_to_one :company
end

p Company.first.positions
# [#<Position @values={:id=>1, :name=>"CEO", :company_id=>1}>, #<Position @values={:id=>2, :name=>"CTO", :company_id=>1}>]

p Position.first.company
# #<Company @values={:id=>1, :name=>"Acme"}>

答案 1 :(得分:0)

我可以让你的协会工作:

require 'sequel'

DB = Sequel.connect('sqlite://test.db')

unless DB.table_exists? (:positions)
  DB.create_table :positions do
    primary_key :id
    string      :name
    foreign_key :company_id
  end
end

unless DB.table_exists?(:companies)
  DB.create_table :companies do
    primary_key :id
    string      :name
    foreign_key :position_id
  end
end

class Position < Sequel::Model
  one_to_one :company 
end

class Company < Sequel::Model
  many_to_one :position 
end

ford = Company.create(name: "Ford")
vw = Company.create(name: "VW")

accountant.company = ford
p accountant.company  #=> #<Company @values={:id=>53, :name=>"Ford", :position_id=>35}>
puts accountant.id    #=> 35

accountant.add_company(vw)  #=> undefined method `add_company' for #<Position...

我补充说,续集关于协会的文档非常糟糕。他们需要包含一个完整的示例 - 包括如何创建对象以使它们相互关联。