【问题标题】:Rails acts_as_paranoid and has_many :throughRails act_as_paranoid 和 has_many :through
【发布时间】:2013-01-07 01:24:20
【问题描述】:

所以我正在使用 rails3_acts_as_paranoid gem,并且在使用 has_many 控制范围时遇到了一些问题:通过关联。

例如

# User.rb
acts_as_paranoid
has_many :folders
has_many :files, :through => :folders

-

# Folder.rb
acts_as_paranoid
belongs_to :user
has_many :files, :dependent => :destroy

-

# File.rb
acts_as_paranoid
belongs_to :files

现在让我们在 users_controller.rb 中的某处说我想查询属于用户的所有文件,无论它们是否被删除,和/或属于已删除的文件夹。所以很自然我会假设做如下的事情

current_user.files.with_deleted

with_deleted 方法在删除files.deleted_at IS NULL 方面发挥作用

...但是... 它不会删除在幕后使用的文件夹的 default_scope。所以我们仍然有一个folders.deleted_at IS NULL 条件,阻止我检索属于那些已删除_at 不为空的文件夹的文件。

我想继续使用acts_as_paranoid,因为它在我的应用程序的所有其他地方都非常有用,并且我尽量不做手动过滤和弹出.where_values数组的元素之类的事情。但我对处理复杂范围或有哪些可用方法了解不多。

【问题讨论】:

  • 看来#unscoped 方法就是您要在这里寻找的方法:apidock.com/rails/ActiveRecord/Scoping/Default/ClassMethods/…
  • 我尝试了 unscoped 方法,但这会降低自动连接桥接用户到文件的范围,特别是 INNER JOIN folders ON files.folder_id = folders.id WHERE folders.user_id = 1,除非我错过了 unscoped 的功能来保留它?
  • 我仍在检查是否找到解决方案,但请注意 @user = User.find current_user.id 行没有用,因为您正在重新加载 current_user
  • 好的,更新它的用处不大:)
  • 这里的答案很好:stackoverflow.com/questions/1540645/…

标签: ruby ruby-on-rails-3 scope associations acts-as-paranoid


【解决方案1】:

好吧,我的问题被否决了,不知道为什么。但我找到了答案:

在 has_many through 上时,我遇到的问题是无法控制 through 模型的范围(在本例中为文件夹)。

原来你可以这样做

@myvar = Folder.unscoped { current_user.files.with_deleted } 

对于否决它的人 - 我想知道原因,以便下次我可以提出更好的问题。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2015-11-27
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多