2013-04-03 30 views
0

我有以下關係Rails的手冊SQL

Foo的has_many Bar

那我也不過Foo模式Bar只是一個String這是一個id。 我可以創建一個Bar模型只包含String id,但我想知道是否有可能以及如何使Foo查詢所有Bars並將其作爲list存儲在Foo模型中。如果我不得不使用SQL,那很好。

另一種替代方法是刪除Bar表,然後將其作爲字段放在Foo表中,但這需要序列化並且很難並且使SQL搜索效率低下。

架構是follwing

Foo的has_many Foo_BarsBar的has_many Bar_Foos

之所以沒有Foo has_and_belongs_to_many Bar是因爲一個Foo或單個Bar的添加信息將是一個永遠結尾鏈,認爲這是一個二分圖,如FooBar是一個不相交的集合。

該數據庫與另一個應用程序共享,我使用rails作爲可視化界面來管理數據。

我的問題是我真的需要一個Foo_Bars模型?

+0

你會有一個隨機的酒吧,你將需要噸o查找它屬於哪個Foo?一個酒吧可以屬於多個Foo嗎?如果是這樣,你是否需要搜索所有富有的特定酒吧?根據什麼,確切地說,Foo和Bar表示以及他們的現實生活中的關係,有很多方法可以實現。一切從Foo中的序列化屬性到與連接表的has_and_belongs_to_many關係。請提供更多信息。 – JofoCodin 2013-04-03 20:53:54

+0

是的,這是一個has_and_belongs_to_many關係,但因爲在大多數情況下,Foo實體不需要查找整個Bar信息,Bar.id足以建立關係。此外,我忘記提及獲取酒吧的信息是昂貴的,這就是爲什麼我決定只有Bar.id足夠與Foo實體一起來。還有一個包含完整信息的表格欄。 – fxe 2013-04-03 21:01:39

+1

如果您只想拉取ID,您可以將其保留爲'Foo has_many Bars'關係並使用'foo.bars.all:select =>:id'。這將創建相當於SQL的SQL:'從bars where bar.foo_id =#{foo.id}'中選擇id。只要外鍵bars.foo_id被索引,它應該非常高效。 – JofoCodin 2013-04-03 21:40:12

回答

2

聽起來像你必須創建一個酒吧模型。 Rails的默認主ID是一個整數,而不是一個字符串。您似乎想要列出所有屬於Foo的「屬於」的酒吧。所以,你的遷移將是這樣的:

軌G型條foo_id:整數

現在裏面/models/bar.rb:

class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 

你的模型/ foo中。RB:

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

創建富國外IDS一些酒吧記錄,你現在可以查詢屬於此爲foo的所有酒吧:

foo = Foo.find id 
foo.bars 

或酒吧:

Bar.where(:foo_id => id) 

閱讀並練習: http://guides.rubyonrails.org/active_record_querying.html

1

你可以有這樣的事情方法美孚模型

class Foo < ActiveRecord::Base 
    serialize :barlist 

    ... 

    def store_barlist 
    update_attributes(:barlist => self.bars.map {|bar| bar.string_id }) 
    end 
end 

要在控制器調用此方法,你必須做這樣的事情。

def some_controller_action 
    @foo = Foo.find(1) 
    @foo.store_barlist 
end