ActiveRecord除了其简洁易读的语法之外,还有其他好处吗?是否ActiveRecord比纯SQL占用更多的内存?(我正在使用PostgreSQL。)
我在Alexander Dymo 关于Rails性能的博客文章中读到ActiveRecord比纯SQL占用更多的内存:
使用ActiveRecord可以轻松操作数据。但是ActiveRecord本质上是数据之上的包装器。如果表中有1G的数据,则ActiveRecord表示将需要2G,在某些情况下还会更多。是的,在90%的情况下,开销可以通过获得额外的便利来证明是合理的。但有时您不需要它。
我还在文档中读到ActiveRecord更好:
如果您习惯于使用原始SQL查找数据库记录,那么通常会发现有更好的方法在Rails中执行相同的操作。在大多数情况下,Active Record使您无需使用SQL。
我一直在体验Error R14 (Memory quota exceeded)Heroku,因此为了解决这个问题,我了解了膨胀和内存泄漏。我已经确定了一些改进的方法,包括像中List.joins(:quantities).find(@list_id)那样急于加载ActiveRecord数据,以及减少了对数据库的总体调用。但是我仍然渴望记忆。
如果ActiveRecord的好处仅仅是易于编写,那么我将在可能的地方编写纯SQL。但是我希望SO社区可以对这些折衷进行评论,并填补我的理解上的任何空白,尤其是如果我在离开AR之前应该三思而后行。
完全摆脱AR会很不好吗?
我正在关注这个 Treehouse Build a Rails API 课程。我正在使用 Cloud9 IDE,我认为这与问题有关。我坚持的步骤是通过控制台中的 API 创建一个新列表。
起初,我从网络收到一条错误消息,说“无法呈现控制台”。在谷歌搜索之后,我在 development.rb 文件中将该网络列入白名单。错误消息是不同的,所以我相信我正确地将它列入白名单(或至少做了一些事情)。但它没有达到预期的效果,错误信息似乎自相矛盾。
Started POST "/api/lists" for 123.456.78.999 at 2015-09-14 14:53:33 +0000 Cannot render console from 123.456.78.999! Allowed networks: 123.456.78.999, 127.0.0.0/127.123.123.123, ::1
我更改了数字,因为我不了解安全性。重点(对我来说也是个谜)是它说我无法从明显允许的网络(即 123.456.78.999 === 123.456.78.999)渲染控制台。
我将不胜感激任何关于可能是什么问题的建议。在这一步之前,我一直在学习教程;我输入的命令导致与视频中相同的结果。
这是我输入的最新命令:
curl -i -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"title":"The Title will go here"}' https://myapp-me.c9.io/api/lists
到目前为止,输入该 URL 而不是“localhost”对我有用,但它也可能与问题有关。
感谢您提供任何线索,并乐意在需要时发布其他代码。
对于长数组来说,似乎#sum比#reduce快,而对于短数组,它们基本相同.
def reduce_t(s,f)
start = Time.now
puts (s..f).reduce(:+) #Printing the result just to make sure something is happening.
finish = Time.now
puts finish - start
end
def sum_t(s,f)
start = Time.now
puts (s..f).sum
finish = Time.now
puts finish - start
end
irb(main):078:0> sum_t(1,10); reduce_t(1,10)
55
0.000445
55
0.000195
=> nil
irb(main):079:0> sum_t(1,1000000); reduce_t(1,1000000)
500000500000
8.1e-05
500000500000
0.101487
=> nil
Run Code Online (Sandbox Code Playgroud)
除速度外还有其他考虑因素吗?有没有什么情况下使用#reduce而不是#sum来完成相同的结束,这是一个简单的总和?
编辑
mu太短了正确指出我应该在得出关于时序结果的结论之前进行多次迭代.我没有使用,Benchmark因为我还不熟悉它,但我希望我在下面写的内容足够且令人信服.
def sum_reduce_t(s,f)
time_reduce = 0
time_sum = 0
reduce_faster = 0
sum_faster = 0
30.times …Run Code Online (Sandbox Code Playgroud) 我最近查看了我的 schema.rb 文件,并惊讶地发现我的数据库中确实存在的某些列没有出现,并且一些表完全丢失了。通过“def change add_column”迁移将丢失的列添加到数据库中,尽管以这种方式添加的某些列确实在 schema.rb 中按预期显示。
仔细检查后,我意识到自从我创建用户表以来,schema.rb 还没有更新。
20151019205241_create_users.rb:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false
end
end
end
Run Code Online (Sandbox Code Playgroud)
这在实践中并没有给我带来问题,但我认为 schema.rb 应该保持自动更新,并且更新它以重新创建数据库非常重要。谁能帮我弄清楚为什么它不会更新?
一种可能性是当我将数据库从 sqlite3 切换到 postgresql 时它停止更新。我记不太清楚了,但我认为时机是有道理的。