关联范围 - 这是更好的方法吗?

时间:2011-11-27 20:02:58

标签: ruby-on-rails activerecord ruby-on-rails-3.1 named-scope

我有两种方法可以做类似的事情,并且想知道:1。对数据库的要求是什么?2。哪个更快?3。哪个占用更少的内存?,4。如果在比较两者时我还需要考虑其他任何问题。

基本上,我有一个拥有多个Exchange的事件模型。我需要按“long”和“short”类型排序的事件的交换。第一种方式是这样的:

@event.exchanges.each do |ex|
  if ex.short == true
    @sells << [ex.price, ex.quantity]
  else
    @buys << [ex.price, ex.quantity]
  end
end

其他方法是在Exchange模型上为短型和长型设置范围,并对交换进行排序,如下所示:

@sells = @event.exchanges.shorts
@buys = @event.exchanges.longs

第二种方式更简洁,更易于阅读。但似乎ActiveRecord必须两次“循环”所有交易所。我正在使用第一种方式,因为我想最小化Rails访问数据库的时间。但我可能误解了数据库的工作原理。我也(盲目地)猜测第二种方式占用更多内存,因为当我真正需要两个属性时(比如第一种方法给出的),我得到了整个对象。

我是正确地理解这个还是离开了?是否还有其他因素我应该考虑?

-----在Schema编辑----- 这是Event&amp; amp;的架构。交换模型:

create_table "events", :force => true do |t|
  t.string   "title"
  t.text     "description"
  t.integer  "last_price"
  t.integer  "outcome"
  t.boolean  "closed"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "exchanges", :force => true do |t|
  t.integer  "event_id"
  t.integer  "user_id"
  t.integer  "price"
  t.integer  "quantity"
  t.boolean  "short"
  t.datetime "created_at"
  t.datetime "updated_at"
end

1 个答案:

答案 0 :(得分:1)

对它进行基准测试是确定的唯一方法,但是你的第一个例子让ruby循环遍历查询的每一行以构建两个数组,而第二个例子让数据库聚合结果和只需一步即可归还。

你可以使用rails基准测试器来确定,但我个人的本能是“合理的条件”(无论这意味着什么)你最好让数据库完成繁重的工作并取回两个阵列让数据库返回一个数组,遍历每个元素,并为每个元素进行值测试和数组添加。