我有一个相当复杂的SQL查询,我很确定我无法用ARel完成(Rails 3.0.10)
查看链接,但它有一些连接和一个where exists子句,我很确定对于ARel来说太复杂了.
然而我的问题是,在此查询过于复杂之前,使用ARel我可以使用includes其他模型来避免n + 1问题.既然我正在使用find_by_sql,那就不行了includes.我仍然希望能够获取这些记录并将它们附加到我的模型实例,方式includes如此,但我不太确定如何实现这一点.
有人能指出我正确的方向吗?
我还没有尝试在同一个查询中加入它们.我只是不确定它们将如何映射到对象(即,如果ActiveRecord将它们正确映射到正确的类)
我知道当使用includesActiveRecord实际进行第二次查询时,会以某种方式将这些行附加到原始查询中的相应实例.有人可以告诉我如何做到这一点吗?或者我是否需要加入相同的查询?
所以Rails时间戳很棒.我正在使用它将expires标头添加到以10位数时间戳结尾的所有文件.然而,我的大多数图像都在我的CSS中引用.有没有人遇到任何允许将时间戳添加到CSS引用图像的方法,或者实现此目的的一些时髦的重写规则?我喜欢我站点中的所有图像,内联和css都有这个时间戳,所以我可以告诉浏览器缓存它们,但是在文件本身发生变化时刷新.
我在网上找不到任何关于此的内容,我无法相信这不是一个更常讨论的话题.
我不认为我的设置会很重要,因为根据10位数的时间戳,实际到期将有希望以相同的方式发生,但是如果重要的话,我正在使用apache来提供所有静态内容
我在验证时试图在我的子模型中访问我的父模型.我在has_one上发现了一些关于反属性的东西,但是我的Rails 2.3.5无法识别它,所以它一定没有进入发行版.我不确定它是否正是我所需要的.
我想根据父属性有条件地验证子项.我的父模型已经创建.如果在我对父项进行update_attributes时尚未创建子项,则它无权访问父项.我想知道如何访问这个父母.它应该很简单,像parent.build_child这样设置子模型的parent_id,为什么在为accepts_nested_attributes_for构建子项时没有这样做?
例如:
class Parent < AR
has_one :child
accepts_nested_attributes_for :child
end
class Child < AR
belongs_to :parent
validates_presence_of :name, :if => :some_method
def some_method
return self.parent.some_condition # => undefined method `some_condition' for nil:NilClass
end
end
Run Code Online (Sandbox Code Playgroud)
我的表格是标准的:
<% form_for @parent do |f| %>
<% f.fields_for :child do |c| %>
<%= c.name %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
使用更新方法
def update
@parent = Parent.find(params[:id])
@parent.update_attributes(params[:parent]) # => this is where my child validations take place
end
Run Code Online (Sandbox Code Playgroud) 我不知道为什么我无法解决这个问题,我认为应该相当简单.我有两个型号(见下文).我正在尝试为SupplierCategory提出一个命名范围,该范围将找到所有SupplierCategory(s)(包括:供应商),其关联的供应商不是空的.
我尝试了一个直接加入,named_scope :with_suppliers, :joins => :suppliers它只给了我与供应商的类别,但它给了我每个类别单独列出,所以如果一个类别有2个供应商,我在返回的数组中获得两次类别:
目前我正在使用:
named_scope :with_suppliers, :include => :suppliers
Run Code Online (Sandbox Code Playgroud)
然后在我看来我正在使用:
<%= render :partial => 'category', :collection => @categories.find_all{|c| !c.suppliers.empty? } %>
Run Code Online (Sandbox Code Playgroud)
不完全雄辩,但说明了我想要实现的目标.
类定义
class SupplierCategory < AR
has_many :suppliers, :order => "name"
end
class Supplier < AR
belongs_to :supplier
end
Run Code Online (Sandbox Code Playgroud) 我听说有些人说你不应该把你的内部ID暴露给外面的世界(例如auto_increment'ng主键).
有人建议使用某种uuid列来代替查找.
我想知道为什么会这样建议,如果真的很重要的话.
使用uuid基本上只是混淆了id.重点是什么?我唯一能想到的是auto_incrementing整数显然指出了我的db对象的顺序.如果外部用户知道有一件事是在另一件事之前/之后创建的,那有关系吗?
或者纯粹是混淆id会阻止对特定对象的不同操作进行"猜测"?
在设计面向外部的API时,这是否是我应该考虑的问题?
我正在我的网站(http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js)上加载jQuery jQuery 和gzip.在firefox中,jquery文件显示为19k请求,但Safari将其显示为56k请求.我假设Safari不接受它作为gzip文件.这是怎么回事?它来自谷歌,我很确定它应该是gzip
所以我试图通过post-receive钩子来构建hudson.在我的本地git repo中,我将post-receive.sample设置为post-receive,chmod 755并添加到行中:
/usr/bin/curl -u user:secret http://localhost:8080/hudson/job/MyJob/build?token=secondsecret
Run Code Online (Sandbox Code Playgroud)
如果我强制构建,hudson会更新代码,但是这里是我不理解的,那个repo中的钩子没有像他们在本地那样的.sample,而且在hudson repo中的post-receive没有上面有那行代码.这里发生了什么以及如何将钩子集成到整个git进程中?我需要更改远程仓库上的这个钩子吗?我本以为在本地做这件事就足够了,所以任何从该回购中取出的人都会得到新的钩子.我无法理解另一个用户的repo将如何具有不同的钩子.
我不明白为什么有些人会在ruby中使用百分比语法.
例如,我正在阅读ruby插件指南,它使用如下代码:
%w{ models controllers }.each do |dir|
path = File.join(File.dirname(__FILE__), 'app', dir)
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
Run Code Online (Sandbox Code Playgroud)
每当我看到这样的东西时,我都要去查找百分比语法参考,因为我不记得%w的含义.
这种语法真的比较["models", "controllers"].each ...好吗?
我认为在后一种情况下,我更清楚的是我已经定义了一个字符串数组,但在前者中 - 特别是对于学习红宝石的人 - 它似乎并不那么清楚,至少对我而言.
如果有人可以告诉我,我在这里遗漏了一些关键点,那么请这样做,因为我很难理解为什么百分比语法似乎是绝大多数ruby程序员的首选.
我正在尝试使用arel查询此sql代码段的等效内容:
WHERE (("participants"."accepted" = 'f' AND "participants"."contact_id" = 1)
OR "participants"."id" IS NULL)
Run Code Online (Sandbox Code Playgroud)
所以我想要 (accepted && contact_id=1) OR NULL
这是我在AREL中得到的
participants[:accepted].eq(false).and(participants[:contact_id].eq(1).
or(participants[:id].is(nil)
Run Code Online (Sandbox Code Playgroud)
问题是,这会产生:
("participants"."accepted" = 'f' AND "participants"."contact_id" = 1 OR "participants"."id" IS NULL)
Run Code Online (Sandbox Code Playgroud)
请注意我和条件周围缺少括号.我相信根据运营商的优先顺序,我得到了:
accepted && (contact_id=1 OR NULL)
Run Code Online (Sandbox Code Playgroud)
在AREL查询中添加括号没有任何影响.有什么想法吗?
在Rails 3中,我可以这样做:
match "/page(/:section)", :to => 'some_controller#page'
Run Code Online (Sandbox Code Playgroud)
而且两者/page并/page/some_section会映射到some_controller#页
在Rails 2.3.x中是否有相同的功能?我似乎找不到它
我目前正在使用两种不同的路由方法,如下所示:
map.page '/page', :action => 'page'
map.page_section '/page/:section', :action => 'page'
Run Code Online (Sandbox Code Playgroud) activerecord ×2
arel ×2
ruby ×2
sql ×2
apache ×1
api ×1
associations ×1
git ×1
hook ×1
javascript ×1
join ×1
routing ×1
safari ×1
security ×1
syntax ×1