Rails手动SQL

时间:2013-04-03 20:29:28

标签: ruby-on-rails ruby activerecord

我有以下关系

Foo has_many Bar

然后我有Foo模型,但Bar只是一个String id。 我可以创建仅包含Bar的{​​{1}}模型,但我想知道是否可行以及如何使String id查询所有Foo并将其存储为Bars {1}}模型中的{1}}。

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

另一个替代方法是删除list表,然后将其作为字段放在Foo表中,但是这需要序列化并且很难并且使SQL搜索效率低下。

架构是以下

Bar has_many FooFoo has_many Foo_Bars

不是Bar has_and_belongs_to_many Bar_Foos的原因是因为单个Foo或单个Bar的添加信息将是一个永无止境的链,认为这是像FooBar这样的二分图是一个不相交的集合。

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

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

2 个答案:

答案 0 :(得分:2)

听起来你必须要创建一个酒吧模型。 Rails默认主id是整数,而不是字符串。你似乎想要列出'belongs_to'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 foreign ID创建一些条形记录,现在您可以通过以下方式查询属于foo的所有条形图:

foo = Foo.find id
foo.bars

或来自Bar:

Bar.where(:foo_id => id)

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

答案 1 :(得分: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