由于信息安全限制,我在产品上有默认范围.
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可能已经是零.
假设我有一个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删除所有现有范围的基本原则,但是它不应该知道并保持关联范围吗?
拉取所有评论的最佳方式是什么?
我的Rails应用程序中存在以下情况。假设有用户和公司两种模型:
class User < ActiveRecord::Base
belongs_to :company
default_scope -> {where(removed_at: nil)}
end
Run Code Online (Sandbox Code Playgroud)
和
class Company < ActiveRecord::Base
has_many :users
end
Run Code Online (Sandbox Code Playgroud)
我现在想要的是加载公司记录并包括用户
Company.unscoped.all.includes(:users)
Run Code Online (Sandbox Code Playgroud)
这将导致对包含默认范围的用户表的查询。因此,我获得了所有未删除的用户都已预取的公司记录。但是在这种情况下,我确实也希望其中remove_at不为null的用户(=>已删除的用户记录)。“不受范围限制”的方法仅适用于公司模型,而不适用于用户模型。
有什么办法吗?感谢您的任何想法!