繁体   English   中英

关联范围-哪种方法更好?

[英]Association scope- which is the better way to do this?

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

基本上,我有一个具有多个交流的事件模型。 我需要针对按“长”和“短”类型排序的事件进行交换。 第一种方式是这样的:

@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访问数据库的时间。 但是我可能会误解数据库的工作方式。 我也(盲目地)猜测,当我实际上只需要两个属性时(如第一个方法给出的那样),当您获得整个对象时,第二种方法会占用更多的内存。

我是正确理解还是摆脱了? 我还应该考虑其他因素吗?

-----在架构中进行编辑-----这是事件和交换模型的架构:

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

基准测试是唯一可以肯定的方法,但是第一个示例在查询的每一行中都有ruby循环,以建立两个数组,而第二个示例则数据库将结果汇总并一步返回。

您可以使用rails基准测试程序来确定,但我个人的直觉是出于“合理的条件”(无论这意味着什么),最好让db承担繁重的工作并返回两个数组而不是让数据库返回单个数组,遍历每个元素,并为每个元素进行值测试和数组加法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM