相关疑难解决方法(0)

覆盖Rails default_scope

如果我有一个带默认范围的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,对吧?

ruby-on-rails

150
推荐指数
8
解决办法
8万
查看次数

如何在Rails中自动排序has_many关系?

这似乎是一个非常简单的问题,但我还没有看到它在任何地方得到解答.

在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)

但有些东西告诉我它应该更简单.我错过了什么?

ruby-on-rails

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

Rails:为什么with_exclusive_scope受到保护?关于如何使用它的任何好的做法?

给定一个带有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)

这是如此丑陋! - 不能成为轨道!?

scope ruby-on-rails

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

default_scope和association

假设我有一个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删除所有现有范围的基本原则,但是它不应该知道并保持关联范围吗?

拉取所有评论的最佳方式是什么?

ruby-on-rails default-scope

25
推荐指数
5
解决办法
8537
查看次数

ActiveRecord查找全部不按ID排序?

我在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顺序返回对象?

activerecord sql-order-by ruby-on-rails-3

18
推荐指数
2
解决办法
8165
查看次数