我在rails中有一个方法就是这样做:
a = Foo.new("bar")
a.save
b = Foo.new("baz")
b.save
...
x = Foo.new("123", :parent_id => a.id)
x.save
...
z = Foo.new("zxy", :parent_id => b.id)
z.save
Run Code Online (Sandbox Code Playgroud)
问题是我添加的实体越多越长.我怀疑这是因为它必须为每条记录命中数据库.由于它们是嵌套的,我知道在父母得救之前我无法拯救孩子,但我想立刻拯救所有的父母,然后是所有的孩子.做一些像这样的事情会很好:
a = Foo.new("bar")
b = Foo.new("baz")
...
saveall(a,b,...)
x = Foo.new("123", :parent_id => a.id)
...
z = Foo.new("zxy", :parent_id => b.id)
saveall(x,...,z)
Run Code Online (Sandbox Code Playgroud)
这只会在两次数据库命中时完成.有没有一种简单的方法可以在rails中执行此操作,或者我一次只执行一次?
我想获取created_at字段小于今天(日期)的所有记录.有什么像:
MyTable.find_by_created_at(< 2.days.ago)
Run Code Online (Sandbox Code Playgroud) 所以有
record.new_record?
Run Code Online (Sandbox Code Playgroud)
检查某些东西是否是新的
我需要检查是否有东西出来了.
record = some_magic
record.destroy
record.is_destroyed? # => true
Run Code Online (Sandbox Code Playgroud)
这样的事情.我知道毁灭会冻结物体,所以冻结?有点作品,但这个任务有明确的东西吗?
在我的Rails应用程序中,我遇到了几次问题,我想知道其他人如何解决:
我有一些值是可选的记录,所以有些记录有一个值,有些记录的值为null.
如果我在某些数据库上按该列排序,则首先对空值进行排序,在某些数据库上对空值进行排序.
例如,我有照片可能属于或可能不属于集合,即有一些照片在哪里collection_id=nil和一些在哪里collection_id=1等.
如果我Photo.order('collection_id desc)在SQLite上做的话我最后得到空值但是在PostgreSQL上我先得到空值.
是否有一个很好的标准Rails方法来处理这个并在任何数据库中获得一致的性能?
在我的应用程序中,用户可以创建业务.当他们触发index我的行动时,我BusinessesController想检查一个企业是否与以下内容相关current_user.id:
new操作.我试图用这个:
if Business.where(:user_id => current_user.id) == nil
# no business found
end
Run Code Online (Sandbox Code Playgroud)
但即使业务不存在,它也总是会回归......
如何测试数据库中是否存在记录?
我似乎无法使用ActiveRecord :: Base.find选项:一次订购多个列.
例如,我有一个带有日期和参加列的"显示"模型.
如果我运行以下代码:
@shows = Show.find(:all, :order => "date")
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
[#<Show id: 7, date: "2009-04-18", attending: 2>,
#<Show id: 1, date: "2009-04-18", attending: 78>,
#<Show id: 2, date: "2009-04-19", attending: 91>,
#<Show id: 3, date: "2009-04-20", attending: 16>,
#<Show id: 4, date: "2009-04-21", attending: 136>]
Run Code Online (Sandbox Code Playgroud)
如果我运行以下代码:
@shows = Show.find(:all, :order => "attending DESC")
[#<Show id: 4, date: "2009-04-21", attending: 136>,
#<Show id: 2, date: "2009-04-19", attending: 91>,
#<Show id: 1, date: "2009-04-18", attending: 78>,
#<Show id: 3, date: …Run Code Online (Sandbox Code Playgroud) Model.scoped现在不推荐使用Rails 4 .
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
但是,有一个区别Model.scoped和Model.all,也就是说,scoped.scoped返回一个范围,而all.all运行该查询.
在Rails 3上:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
Run Code Online (Sandbox Code Playgroud)
在Rails 4上:
> Model.all.all.is_a?(ActiveRecord::Relation)
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`).
=> false
Run Code Online (Sandbox Code Playgroud)
库/关注中的用例会scoped在有条件执行某些操作时返回,如下所示:
module AmongConcern
extend ActiveSupport::Concern
module …Run Code Online (Sandbox Code Playgroud) 在轨道3,使用ActiveRecord,是有一个单一查询的方式来设定:隐藏字段,TRUE对符合条件......也就是说,例如所有记录,:condition => [ "phonenum = ?", some_phone_number ]
如果单个查询无法做到,那么最佳方法是什么?
使用一个简单示例进行设置:我有一个table(Totals),它保存amount第二个表(Things)中每个记录的列的总和.
当thing.amount更新时,我想简单地添加旧值和新值之间的差异total.sum.
现在我正在减去self.amount期间before_update并self.amount在期间添加after_update.这使得WAY过于信任更新成功.
约束: 我不想简单地重新计算所有交易的总和.
问题:很简单,我想在after_update回调期间访问原始值.你有什么方法可以做到这一点?
更新:我将采用Luke Francl的想法.在after_update回调期间,您仍然可以访问self.attr_was我想要的值.我还决定使用after_update实现,因为我想在模型中保留这种逻辑.这样,无论我将来如何决定更新交易,我都知道我正在更新交易总和.感谢大家的实施建议.
你能告诉我创建has_one关系的最佳做法吗?
如果我有一个用户模型,它必须有一个配置文件...
我怎么能做到这一点?
一个解决方案是:
# user.rb
class User << ActiveRecord::Base
after_create :set_default_association
def set_default_association
self.create_profile
end
end
Run Code Online (Sandbox Code Playgroud)
但这似乎不是很干净......有什么建议吗?
ruby activerecord ruby-on-rails associations ruby-on-rails-3
activerecord ×10
ruby ×4
associations ×1
callback ×1
data-access ×1
exists ×1
model ×1
null ×1
sorting ×1