如果我有一个带默认范围的ActiveRecord :: Base模型:
class Foo < ActiveRecord::Base
default_scope :conditions => ["bar = ?",bar]
end
Run Code Online (Sandbox Code Playgroud)
有没有办法Foo.find 不使用这些default_scope条件?换句话说,您可以覆盖默认范围吗?
我原以为在名称中使用'default'会表明它是可以覆盖的,否则会被称为类似的global_scope,对吧?
这似乎是一个非常简单的问题,但我还没有看到它在任何地方得到解答.
在rails中如果您有:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
Run Code Online (Sandbox Code Playgroud)
为什么你不能用这样的东西订购评论:
@article.comments(:order=>"created_at DESC")
Run Code Online (Sandbox Code Playgroud)
如果您需要经常引用命名范围,甚至人们都会这样做:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Run Code Online (Sandbox Code Playgroud)
但有些东西告诉我它应该更简单.我错过了什么?
给定一个带有default_scope的模型来过滤所有过时的条目:
# == Schema Information
#
# id :integer(4) not null, primary key
# user_id :integer(4) not null, primary key
# end_date :datetime
class Ticket < ActiveRecord::Base
belongs_to :user
default_scope :conditions => "tickets.end_date > NOW()"
end
Run Code Online (Sandbox Code Playgroud)
现在我想得到任何票.在这种情况下,with_exclusive_scope是要走的路,但这种方法是否受到保护?只有这个有效:
Ticket.send(:with_exclusive_scope) { find(:all) }
Run Code Online (Sandbox Code Playgroud)
有点黑客,不是吗?那么正确的使用方法是什么?特别是在处理协会时,情况变得更糟(假设用户有很多票):
Ticket.send(:with_exclusive_scope) { user.tickets.find(:all) }
Run Code Online (Sandbox Code Playgroud)
这是如此丑陋! - 不能成为轨道!?
假设我有一个Post模型和一个Comment模型.使用常见模式,Post has_many Comments.
如果Comment设置了default_scope:
default_scope where("deleted_at IS NULL")
Run Code Online (Sandbox Code Playgroud)
无论范围如何,如何轻松检索帖子上的所有评论?这会产生无效结果:
Post.first.comments.unscoped
Run Code Online (Sandbox Code Playgroud)
这会生成以下查询:
SELECT * FROM posts LIMIT 1;
SELECT * FROM comments;
Run Code Online (Sandbox Code Playgroud)
代替:
SELECT * FROM posts LIMIT 1;
SELECT * FROM comments WHERE post_id = 1;
Run Code Online (Sandbox Code Playgroud)
运行:
Post.first.comments
Run Code Online (Sandbox Code Playgroud)
生产:
SELECT * FROM posts LIMIT 1;
SELECT * FROM comments WHERE deleted_at IS NULL AND post_id = 1;
Run Code Online (Sandbox Code Playgroud)
我理解uncoped删除所有现有范围的基本原则,但是它不应该知道并保持关联范围吗?
拉取所有评论的最佳方式是什么?
我在Heroku部署上遇到了一个奇怪的问题,我似乎无法在本地复制.基本上当我在特定模型上找到所有内容而不是按ID排序时,它似乎根本无法返回它们.
通常记录如下:
>> Model.all
=> [<model id: 2>,<model id: 1>,<model id: 3>,<model id: 4>,<model id: 5>]
Run Code Online (Sandbox Code Playgroud)
... 等等.
如果我明确地调用Model.order("id ASC")它,则按预期返回模型.
是什么赋予了?为什么会发现所有不按降序ID顺序返回对象?