2010-03-10 47 views
1

我正在從Harvest中提取數據。這裏是我的兩個模型和架構:如何讓foreign_key在這個簡單的has_many,belongs_to關係中工作?

# schema 
create_table "clients", :force => true do |t| 
    t.string "name" 
    t.integer "harvest_id"  
end 

create_table "projects", :force => true do |t| 
    t.string "name" 
    t.integer "client_id" 
    t.integer "harvest_id" 
end 

# Client.rb 
has_many :projects, :foreign_key => 'client_id' # not needed, I know 

# Project.rb 
belongs_to :client, :foreign_key => 'harvest_id' 

我試圖讓項目通過匹配Project.client_id到Client.harvest_id找到自己的客戶端。這是我所得到的。

> Project.first.client_id 
=> 187259 

Project.first.client 
=> nil 

Client.find(187259).projects 
=> [] 

這可能嗎?謝謝!

回答

0

可能似乎並不直觀,但對於雙方關係的foreign_key必須是相同的。假設您決定使用harvest_id作爲外鍵。它應該像這樣設置:

# Client.rb 
has_many :projects, :foreign_key => 'harvest_id' 

# Project.rb 
belongs_to :client, :foreign_key => 'harvest_id' 

由於客戶端has_many項目,您也只有項目表中的harvest_id字段。

0

由於您在項目模型中的belongs_to關係在harvest_id上,您必須確保在項目對象中設置了harvest_id屬性。

> Project.first.harvest_id 
=> ?? 

如果未設置harvest_id,則可能會出現問題。

0

項目通過匹配項目找到他們的客戶端。 client_id給客戶端。 harvest_id

這似乎沒有什麼意義的客戶和收穫應該是不同的對象/記錄,你不能匹配。

這就像「找到有橙色種子的蘋果」。

所以我們可能需要更多的上下文。


您已定義關係的方式如下:

在項目方面,你說「它通過client_id涉及到客戶端」,但在客戶機上,你說,「它關係到項目通過harvest_id

你有差異。

所以看來你只是有不正確的映射定義。

不知道如何harvest_id應該被使用,所以會使假設它只是聯想:

# Client.rb 
has_many :projects 
belongs_to :harvest 

# Project.rb 
belongs_to :client 
belongs_to :harvest 

# Harvest 
has_one :client 
has_one :project 
相關問題