2014-10-18 38 views
0

参考Sequel's docs我已经在职位和公司之间建立了一个one_to_one联系。续集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

我认为你有这种倒退和错误。 (a)我期望一家公司与职位有'one_to_many'的关系。 (b)如果模型A与模型B有'one_to_many'关系,那么模型B应该与模型A有'many_to_one'关系,而不是'one_to_one'。也许你最好描述你试图建模的数据。 – Phrogz 2014-10-18 06:03:19

回答

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"}> 
+0

**除非您有非常具体的商业案例,否则公司有很多职位,这使得一对多关系和许多职位可以属于一家公司,** O RLY。那么没有两家公司可以拥有相同的职位,例如会计师? – 7stud 2014-10-19 02:17:09

+0

@ 7stud我认为职位是一项特定的工作,而不是一般的职业。你是对的,但这只是我的假设,我不应该做出这种无条件的主张。但似乎我的假设对于OP来说是正确的,因为他接受了它。 – Hnatt 2014-10-19 09:31:39

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... 

我会补充的是,协会的续集文档是可怕的。他们需要包括一个完整的例子 - 包括如何创建对象以便它们相互关联。

+0

从你在我的答案下面写下的内容可以看出,你应该创建一个参考表,即'company_positions',离开公司和职位而没有外键,从而使这两个关系成为多对多关系。或者你想达到什么目标? OP的例子中的关系是矛盾的。从技术上讲,你可以从一方和一对一的OP与其他OP一样,但它没有任何意义,除非你有一个特定的商业案例,但从协会的名称来看,它不是。 – Hnatt 2014-10-19 09:53:20