相关疑难解决方法(0)

为什么使用rails default_scope经常推荐使用?

互联网上的 每个地方人们都提到使用rails default_scope是一个坏主意,而default_scopestackoverflow 的最高命中是关于如何覆盖它.这感觉很混乱,值得一个明确的问题(我认为).

所以:为什么使用rails default_scope这么坏主意?

ruby-on-rails default-scope

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

如何在Rails3中使用unscoped关联关系?

由于信息安全限制,我在产品上有默认范围.

class Product < ActiveRecord::Base
  has_many :photos

  default_scope where('visible = 1')
end
Run Code Online (Sandbox Code Playgroud)

但是,在我的相关照片模型中,我还必须找到不可见的产品.

class Photo < ActiveRecord::Base
  belongs_to :product
end

my_photo.product
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我可以使用unscoped来绕过default_scope,例如在Product.unscoped.find_by_title('abc').然而:

如何在使用记录关联时删除范围?

my_photo.unscoped.product因为my_photo没有调用方法,所以没有意义unscoped.也没有my_photo.product.unscoped任何意义,因为my_photo.product可能已经是零.

scope ruby-on-rails arel ruby-on-rails-3

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

如何在Rails 3中取消关联记录

我在使用范围在rails中正常工作时遇到了一些麻烦.

我的模特:

class User < ActiveRecord::Base
  default_scope :conditions => 'users.deleted_at IS NULL'


class Feed < ActiveRecord::Base
  belongs_to :user, :foreign_key => :author_id
Run Code Online (Sandbox Code Playgroud)

当我打电话给以下人时:

feeds = Feed.includes(:user)
Run Code Online (Sandbox Code Playgroud)

我想为用户跳过default_scope.所以我试过了:

feeds = Feed.unscoped.includes(:user)
Run Code Online (Sandbox Code Playgroud)

但这并不是要从用户那里删除范围.有关如何使其工作的任何建议?谢谢

ruby-on-rails ruby-on-rails-3

6
推荐指数
1
解决办法
4213
查看次数

使用偏执狂的默认范围急切加载已删除的记录

我正在使用paranoia gem 来“软删除”记录。现在,我需要为关联模型立即加载这些记录,其中一些记录可能已被删除。Paranoia 将其添加default_scope到“偏执”模型中:

default_scope :conditions => { :deleted_at => nil }
Run Code Online (Sandbox Code Playgroud)

所以实际上,我有这些(简化的)模型:

class Product
  has_many :orders
  default_scope :conditions => { :deleted_at => nil }
end

class Order
  belongs_to :product
end
Run Code Online (Sandbox Code Playgroud)

我想要实现的是在访问订单时立即加载产品:

Order.includes(:product)
Run Code Online (Sandbox Code Playgroud)

这(来自如何在 Rails3 中的关联关系上使用无作用域?)在这里不起作用:

Product.unscoped { Order.includes(:product) }
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建自定义belongs_to关系来添加条件(如“渴望加载嵌套关联和作用域”),但我找不到删除现有关系的方法(如果可能的话)。

问题:如何防止将默认范围应用于急切加载查询?

ruby-on-rails eager-loading default-scope ruby-on-rails-3

5
推荐指数
1
解决办法
2867
查看次数