标签: activerecord

在rails中的单个调用中保存多个对象

我在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中执行此操作,或者我一次只执行一次?

activerecord data-access ruby-on-rails

78
推荐指数
4
解决办法
9万
查看次数

活动记录 - 查找今天之前创建的记录

我想获取created_at字段小于今天(日期)的所有记录.有什么像:

MyTable.find_by_created_at(< 2.days.ago)
Run Code Online (Sandbox Code Playgroud)

ruby activerecord

78
推荐指数
2
解决办法
4万
查看次数

检查记录是否刚刚在rails中销毁

所以有

record.new_record?
Run Code Online (Sandbox Code Playgroud)

检查某些东西是否是新的

我需要检查是否有东西出来了.

record = some_magic
record.destroy
record.is_destroyed? # => true
Run Code Online (Sandbox Code Playgroud)

这样的事情.我知道毁灭会冻结物体,所以冻结?有点作品,但这个任务有明确的东西吗?

ruby activerecord ruby-on-rails

77
推荐指数
5
解决办法
3万
查看次数

Rails:最后以空值排序

在我的Rails应用程序中,我遇到了几次问题,我想知道其他人如何解决:

我有一些值是可选的记录,所以有些记录有一个值,有些记录的值为null.

如果我在某些数据库上按该列排序,则首先对空值进行排序,在某些数据库上对空值进行排序.

例如,我有照片可能属于或可能不属于集合,即有一些照片在哪里collection_id=nil和一些在哪里collection_id=1等.

如果我Photo.order('collection_id desc)在SQLite上做的话我最后得到空值但是在PostgreSQL上我先得到空值.

是否有一个很好的标准Rails方法来处理这个并在任何数据库中获得一致的性能?

sorting null activerecord ruby-on-rails ruby-on-rails-3

77
推荐指数
9
解决办法
3万
查看次数

检查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 ruby-on-rails exists ruby-on-rails-3

77
推荐指数
3
解决办法
11万
查看次数

Rails Active Record查找(:all,:order =>)问题

我似乎无法使用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)

ruby activerecord ruby-on-rails

76
推荐指数
3
解决办法
15万
查看次数

使用Rails 4时,不推荐使用Model.scoped,但Model.all不能替换它

Model.scoped现在不推荐使用Rails 4 .

DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.

但是,有一个区别Model.scopedModel.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)

activerecord ruby-on-rails-4

76
推荐指数
4
解决办法
2万
查看次数

Rails 3 + activerecord,为所有满足条件的记录"批量更新"单个字段的最佳方式

在轨道3,使用ActiveRecord,是有一个单一查询的方式来设定:隐藏字段,TRUE对符合条件......也就是说,例如所有记录,:condition => [ "phonenum = ?", some_phone_number ]

如果单个查询无法做到,那么最佳方法是什么?

activerecord ruby-on-rails

75
推荐指数
3
解决办法
5万
查看次数

使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

使用一个简单示例进行设置:我有一个table(Totals),它保存amount第二个表(Things)中每个记录的列的总和.

thing.amount更新时,我想简单地添加旧值和新值之间的差异total.sum.

现在我正在减去self.amount期间before_updateself.amount在期间添加after_update.这使得WAY过于信任更新成功.

约束: 我不想简单地重新计算所有交易的总和.

问题:很简单,我想在after_update回调期间访问原始值.你有什么方法可以做到这一点?

更新:我将采用Luke Francl的想法.在after_update回调期间,您仍然可以访问self.attr_was我想要的值.我还决定使用after_update实现,因为我想在模型中保留这种逻辑.这样,无论我将来如何决定更新交易,我都知道我正在更新交易总和.感谢大家的实施建议.

activerecord model ruby-on-rails callback

74
推荐指数
6
解决办法
4万
查看次数

Rails - 最佳实践:如何创建依赖的has_one关系

你能告诉我创建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

74
推荐指数
5
解决办法
4万
查看次数