2013-11-04 57 views
0

我有一個公司實體的位置的HAS_ONE協會:意外的結果查找

class Location < ActiveRecord::Base 
    attr_accessible :city, :country, :postal_code, :state 
end 

class Company < ActiveRecord::Base 
    has_one :headquarters, :class_name => "Location" 
end 

爲公司實體的基礎架構包含一個LOCATION_ID屬性。我希望我應該能夠訪問公司總部的位置信息,像這樣:

Company.find(12345).headquarters 

然而,這導致異常:

SELECT "locations".* FROM "locations" WHERE "locations"."company_id" = 12345 LIMIT 1 
ActiveRecord::StatementInvalid: PGError: ERROR: column locations.company_id does not exist 

我很困惑,爲什麼這是表現這種方式。我期望FK在公司中,而不是位置(即SELECT * FROM位置WHERE locations.id = 12345)。我用其他方式定義了這種查找方式,它們的行爲與我預期的相同。

有幾件事情需要注意:

  • 一個位置不屬於一個公司,許多實體類型可以有一個 位置
  • 我已經試過是多/少在我的關聯定義冗長, 似乎沒有什麼區別
  • 我也是在一個點試圖「HAS_ONE:位置」讓事情變得簡單, 相同的結果

任何幫助表示讚賞。

:)

回答

0

這聽起來像你應該使用belongs_to而不是has_one。具體來說,

class Company < ActiveRecord::Base 
    belongs_to :headquarters, :class_name => "Location", :foreign_key => "location_id" 
end 

,因爲你說的外鍵是在公司,而不是位置。

0

當您說公司擁有一個位置時,您意味着它具有FK的位置表。 has_one關係是一對一的關係,在你的情況下,在Locations表中增加一個company_id是非常合理的。

A belongs_to關係(即位置belongs_to公司)在這裏沒有意義,因爲這樣可以讓您將多家公司連接到一個位置。當然,除非你想允許,否則在Company模型上丟失has_one關係,而是在Location模型上添加belongs_to關係。

更新

company has_many_and_belongs_to location會是一個更好的選擇的關係,因爲一個公司可以有很多地方和一個地方可以有很多公司。

我只是在位置表(is_headquarter)中添加一個額外的列來標識公司的總部。

+0

A公司,B公司和C公司都可以將其總部設在同一個城市,因此連接良好。 – Kevin

+0

是的,這就是我說的:) – rb512

+0

等一下,你是說belongs_to應該在公司或在位置的鏈接工作? – Kevin