0

我有以下关系

Foo有很多Bar

然后我有Foo模型,但Bar它只是String一个id。我可以创建一个Bar仅包含 的模型String id,但我想知道是否可能以及如何进行Foo全部查询Bars并将其作为模型存储list在其中Foo

如果我必须使用 SQL,那很好。

另一种选择是删除Bar表,然后将其作为字段放入Foo表中,但这需要序列化并且会很困难,并且会使 SQL 搜索的猜测效率低下。

架构如下

Foohas_manyFoo_BarsBarhas_manyBar_Foos

没有Foohas_and_belongs_to_many的原因是因为单或单Bar的添加信息将是一个永无止境的链,认为这是一个二分图,例如和是一个不相交的集合。FooBarFooBar

该数据库与另一个应用程序共享,我使用 rails 作为可视界面来管理数据。

我的问题是我真的需要一个Foo_Bars模型吗?

4

2 回答 2

2

听起来您必须创建一个条形模型。Rails 默认主 id 是整数,而不是字符串。您似乎想列出所有“属于”一个 Foo 的酒吧。因此,您的迁移将如下所示:

rails g model bar foo_id:integer

现在在 /models/bar.rb 里面:

class Bar < ActiveRecord::Base
  belongs_to :foo
end

你的模型/foo.rb:

class Foo < ActiveRecord::Base
  has_many :bars
end

创建一些带有 foo 外部 id 的 Bar 记录,您现在可以通过以下方式查询所有属于 foo 的 bar:

foo = Foo.find id
foo.bars

或来自酒吧:

Bar.where(:foo_id => id)

阅读并练习: http: //guides.rubyonrails.org/active_record_querying.html

于 2013-04-03T20:47:43.867 回答
1

您可以在 Foo 模型中使用这种方法

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
于 2013-04-03T20:43:38.070 回答