引用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}>
答案 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...
我补充说,续集关于协会的文档非常糟糕。他们需要包含一个完整的示例 - 包括如何创建对象以使它们相互关联。