【问题标题】:Rails ActiveRecord alternative to ModelName.allRails ActiveRecord 替代 ModelName.all
【发布时间】:2012-02-25 01:42:42
【问题描述】:

最近我在某些情况下使用ModelName.where(nil),而我可能会使用ModelName.all

两者的区别在于前者返回一个ActiveRecord Relation,而后者返回一个数组。我可以将查询链接到前者,但不能链接到后者。不过,我很不高兴我失去了 ModelName.all 的自我记录性质。

有没有像ModelName.all 这样的方法返回一个 AR 关系并维护自文档?

【问题讨论】:

  • where(nil) 是一个非常好的解决方法,它总是返回一个关系。也许在您不确定是否会返回关系或类的情况下 - 您可以在 ActiveRecord::Base 上添加类方法,即 def self.prepare;其中(无);结束。

标签: ruby-on-rails activerecord


【解决方案1】:

ModelName.scoped 会给你一个带有默认范围的 AR 关系,ModelName.unscoped 会给你一个没有默认范围的 AR 关系。

【讨论】:

  • 我不知道这些。知道肯定有用。我不确定我是否会使用这个,因为this response 提到unscoped 在关联中使用可能很危险。 IE。在我当前的项目中:User.first.posts # => []User.first.posts.unscoped # => all posts, by ANY user
【解决方案2】:

在这种情况下,您可以使用ModelName,因为您不能使用all,因为它返回数组。

例如

a = ModelName
a = a.active # here active is scope
a = a.where(:deleted => false)
a = a.all

【讨论】:

  • 我不相信我可以单独枚举ModelNameModelName.each {|obj| ...} # no each method defined for ModelName。与ModelName.where(nil).each {...}ModelName.all.each {...} 进行比较,以防我不需要更深入地了解范围。
【解决方案3】:

我一般都用

Model.find(:all, :conditions=>whatever, :order=>whatever,:limit=>whatever)

在您的情况下,也许 Model.find(:all) 会为您解决问题

【讨论】:

  • Model.find(:all) 返回一个数组。你不能拴在它上面。尝试Model.find(:all).classMethodclassMethodModel 上定义。
  • 我一直记得得到一个活动记录对象数组,我认为这是必要的。我对这个问题的误解。谢谢你告诉我这件事:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多