由于信息安全限制,我在产品上有默认范围.
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可能已经是零.
我在使用范围在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)
但这并不是要从用户那里删除范围.有关如何使其工作的任何建议?谢谢
我正在使用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关系来添加条件(如“渴望加载嵌套关联和作用域”),但我找不到删除现有关系的方法(如果可能的话)。
问题:如何防止将默认范围应用于急切加载查询?