2014-12-07 65 views
0

假設我有兩個模型,在這個例子中是一個站點和一個主題,我想讓一個站點屬於一個主題,但是用一個哈希內的鍵引用它。RoR - 哈希中的Mongoid外鍵

class Site 
    include Mongoid::Document 

    field :preferences, type: Hash 

    belongs_to :theme, foreign_key: :"preferences.theme_id" 

end 

正如你可以看到theme_id存儲命名爲「首選項」的哈希裏面,問題是,這個代碼可以mongoid找不到合適的theme_id。 我該如何處理這種情況?

+1

這是不可能的。但爲什麼要這樣做呢?外鍵在散列 - 它很慢。 – 2014-12-07 17:27:10

+0

MongoDB *是一個散列,所以如果你已經知道你有某些鍵,那麼就讓它們成爲字段。如果允許用戶自定義字段,則在Mongo字段中使用散列是非常有用的。 – evanbikes 2014-12-07 23:12:08

回答

1

如果你要保持你的喜好在一起,他們的結構,你可以使用嵌入文檔而不是一個普通的哈希:

class Site 
    include Mongoid::Document 
    embeds_one :preferences, :class_name => 'Preferences' 
end 
class Preferences 
    include Mongoid::Document 
    embedded_in :site 
    belongs_to :theme 
end 

preferences仍然是數據庫裏面一個哈希,但你」 d得到足夠的Mongoid包裝,使協會工作。如果你這樣做,那麼你會說這樣的話:

t = site.preferences.theme 

如果你願意,你可以從Site情況下,他們的嵌入式preferences委託theme電話。