我正在从SQLite切换到PostgreSQL,用于典型的Rails应用程序.
问题是PG的运行规格变得缓慢.
在SQLite上花了大约34秒,在PG上它是~76秒,这慢了2倍.
所以现在我想应用一些技术来使规范的性能与SQLite相提并论,而不需要修改代码(理想情况下只需设置连接选项,这可能是不可能的).
从头到尾有几件显而易见的事情是:
你可能已经明白我不关心可靠性和其余的(DB在这里只是一次性的东西).
我需要充分利用PG并尽可能快地完成它.
理想情况下,最佳答案将描述这样做的技巧,设置和这些技巧的弊端.
更新: fsync = off + full_page_writes = off仅将时间减少到~65秒(〜-16秒).良好的开端,但远远没有34的目标.
更新2:我尝试使用RAM磁盘,但性能增益在误差范围内.所以似乎不值得.
更新3:* 我找到了最大的瓶颈,现在我的规格和SQLite一样快.
问题是进行截断的数据库清理.显然SQLite在那里太快了.
为了"修复"它,我在每次测试之前打开一个事务并在结束时回滚它.
约700个测试的一些数字.
SQLite的速度提高了2倍.PG的速度提高4倍.
我试图使用Thin app服务器并遇到一个问题.
当nginx 代理使用proxy_pass http://my_app_upstream;应用程序对Thin(或Unicorn)的请求接收由nginx(http://my_app_upstream)发送的修改后的URL .
我想要的是从客户端传递原始URL和原始请求而不进行任何修改,因为应用程序非常依赖它.
nginx的" DOC说:
如果需要以未处理的形式传输URI,则应使用指令proxy_pass而不使用URI部分.
但我不明白如何配置,因为相关的示例实际上使用URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
Run Code Online (Sandbox Code Playgroud)
那么请你帮我弄清楚如何保留客户端的原始请求URL?
如何使用逻辑OR而不是AND组合2个不同的条件?
注意:作为轨道范围生成2个条件,并且不能轻易地将其更改为where("x or y")直接类似的条件.
简单的例子:
admins = User.where(:kind => :admin)
authors = User.where(:kind => :author)
Run Code Online (Sandbox Code Playgroud)
它很容易应用和条件(对于这个特殊情况是没有意义的):
(admins.merge authors).to_sql
#=> select ... from ... where kind = 'admin' AND kind = 'author'
Run Code Online (Sandbox Code Playgroud)
但是,如何生成具有2种不同Arel关系的以下查询?
#=> select ... from ... where kind = 'admin' OR kind = 'author'
Run Code Online (Sandbox Code Playgroud)
似乎(根据Arel自述文件):
OR运算符尚不支持
但是我希望它不适用于此并期望写出如下内容:
(admins.or authors).to_sql
Run Code Online (Sandbox Code Playgroud) 什么是更短的版本?:
from = hash.fetch(:from)
to = hash.fetch(:to)
name = hash.fetch(:name)
# etc
Run Code Online (Sandbox Code Playgroud)
请注意fetch,如果密钥不存在,我想引发错误.
必须有更短的版本,例如:
from, to, name = hash.fetch(:from, :to, :name) # <-- imaginary won't work
Run Code Online (Sandbox Code Playgroud)
如果需要,可以使用ActiveSupport.
这有什么约定?
我使用下面的样式,但不确定它是首选的样式,因为如果我最后错过了一个点,我可能会遇到很多问题而没有意识到这一点.
query = reservations_scope.for_company(current_company).joins{property.development}.
group{property.development.id}.
group{property.development.name}.
group{property.number}.
group{created_at}.
group{price}.
group{reservation_path}.
group{company_id}.
group{user_id}.
group{fee_paid_date}.
group{contract_exchanged_date}.
group{deposit_paid_date}.
group{cancelled_date}.
select_with_reserving_agent_name_for(current_company, [
"developments.id as dev_id",
"developments.name as dev_name",
"properties.number as prop_number",
"reservations.created_at",
"reservations.price",
"reservations.fee_paid_date",
"reservations.contract_exchanged_date",
"reservations.deposit_paid_date",
"reservations.cancelled_date"
]).reorder("developments.name")
query.to_a # ....
Run Code Online (Sandbox Code Playgroud)
那么在多行链接方法的约定是什么?我更喜欢哪一种?
注意:我无法从Ruby编码风格指南中找到一个很好的例子.
在使用这样的代码(EditorTemplates/UserType.ascx)时,默认的ASP.NET MVC2 Html助手似乎会生成重复的HTML ID:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<UserType>" %>
<%: Html.RadioButton("", UserType.Primary, Model == UserType.Primary) %>
<%: Html.RadioButton("", UserType.Standard, Model == UserType.Standard) %>
<%: Html.RadioButton("", UserType.ReadOnly, Model == UserType.ReadOnly) %>
Run Code Online (Sandbox Code Playgroud)
它产生的HTML是:
<input checked="checked" id="UserType" name="UserType" type="radio" value="Primary" />
<input id="UserType" name="UserType" type="radio" value="Standard" />
<input id="UserType" name="UserType" type="radio" value="ReadOnly" />
Run Code Online (Sandbox Code Playgroud)
这清楚地表明了一个问题.所以我一定是在滥用助手等等.
我可以手动指定id为html属性,但我无法保证它将是唯一的.
所以问题是如何确保RadioButton助手生成的ID对于每个值都是唯一的,并且仍然保留用于生成这些ID 的约定(因此嵌套模型是否受到尊重?(最好不要手动生成ID.)
有没有一种简单的方法可以在(rails 3)控制台中打印随机SQL?
类似于awesome_print的东西,甚至可能是Pretty Print.
它不必理解所有可能的方言或超级先进.
我真正想要的是更容易检查ActiveRecord生成的SQL.
目前我只是将SQL复制到网上进行格式化,这显然是一种生产力杀手.
我真的很想query.to_sql.pretty_format_sql看到更好的输出.
谢谢.
我无法找到如何使用jQuery UI排序获取目标元素.
$("#pages").sortable({
opacity: 0.6,
update: function(event, ui) {
var first = ui.item; // First element to swap
var second = ???? // Second element to swap
swapOnServer(first, second);
}
});
Run Code Online (Sandbox Code Playgroud)
所有我试着点元素的选项被拖动,但不是被换用一个:ui.item[0],event.srcElement,event.toElement.
另外,this指向LIST(OL)元素.
说第二个我的意思是:
原始订单是:
| 0 | 1 | 2 | 3 |
我们拖动元素1并将其放在位置3.最终将:
| 0 | 3 | 2 | 1 |
所以第一个元素是1,第二个元素是3(错误!见下文).
更新:我意识到我弄错了.在这种情况下的新订单将是.
| 0 | 2 | 3 | 1 |
结果我的问题真的没有意义.谢谢大家的帮助.我会标记投票并标记答案.
所以问题是如何在这里获得第二个元素?
当前的解决方法(因为没有关于可排序的交换的 …
您是否了解任何与Formtastic类似但在浏览器中执行类似工作的表单构建器?
它不应该很重(所以不是ExtJS)并且理想地与Formtastic生成的结构兼容,基于jQuery和HAML-JS友好.
目的是使用SpineJS for Rails创建表单更容易.
更容易我的意思是:
谢谢.
我需要分析我经常运行的测试套件bundle exec rspec spec/并生成GIF图像.
运行perftools.rb以使其与bundler一起正常工作的命令是什么?
ruby ×6
sql ×3
html ×2
javascript ×2
jquery ×2
activerecord ×1
arel ×1
asp.net-mvc ×1
coding-style ×1
database ×1
forms ×1
hash ×1
html-helper ×1
jquery-ui ×1
nginx ×1
performance ×1
postgresql ×1
pretty-print ×1
profiling ×1
proxy ×1
radio-button ×1
rspec ×1
spine.js ×1
thin ×1
unicorn ×1