2014-10-18 32 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