[英]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.