当前位置: 首页 > 知识库问答 >
问题:

如何在整个rails活动记录关联链中取消特定模型的默认范围?

仇正平
2023-03-14

我试图解决以下问题。我有三个模型:用户has_many相机has_many录音。

class AddTables < ActiveRecord::Migration
  def change
    create_table :users
    create_table :cameras do |t|
      t.references :user, null: false, foreign_key: true
      t.timestamp :archived_at, index: true
    end
    create_table :recordings do |t|
      t.references :camera, null: false, foreign_key: true
      t.timestamp :archived_at, index: true
    end
  end
end

相机和录制具有特殊字段“archived_at”,用于将记录标记为已删除(软删除)。我想让用户#记录查看所有摄像机(任何Camera.archived_at),但同时,我希望它只查看弧形记录(Recording.aarchived_at==nil)。我试过几次,但都没有成功。

===情况1 ===

class User < ActiveRecord::Base
  has_many :cameras, -> { unscope where: :archived_at }
  has_many :recordings, through: :cameras
end

class Camera < ActiveRecord::Base
  default_scope { where(archived_at: nil) }

  belongs_to :user
  has_many :recordings
end

class Recording < ActiveRecord::Base
  default_scope { where(archived_at: nil) }

  belongs_to :camera
end

irb(主):013:0

===情况2===

class User < ActiveRecord::Base
  has_many :cameras, -> { unscope where: :archived_at }
  has_many :recordings, through: :cameras
end

class Camera < ActiveRecord::Base
  default_scope { where(cameras: {archived_at: nil}) }

  belongs_to :user
  has_many :recordings
end

class Recording < ActiveRecord::Base
  default_scope { where(recordings: {archived_at: nil}) }

  belongs_to :camera
end

irb(主):013:0

===情况3 ===

class User < ActiveRecord::Base
  has_many :cameras, -> { unscope where: {cameras: :archived_at} }
  has_many :recordings, through: :cameras
end

class Camera < ActiveRecord::Base
  default_scope { where(cameras: {archived_at: nil}) }

  belongs_to :user
  has_many :recordings
end

class Recording < ActiveRecord::Base
  default_scope { where(recordings: {archived_at: nil}) }

  belongs_to :camera
end

irb(主):016:0

共有1个答案

谢嘉
2023-03-14

试试这个:

< code>user.rb:

class User < ApplicationRecord
    has_many :cameras
    has_many :recordings, -> { unscope(where: :archived_at).where(recordings: {archived_at: nil}) }, through: :cameras
end

相机.rb

class Camera < ApplicationRecord
    default_scope { where(archived_at: nil) }
    belongs_to :user
    has_many :recordings
end

录音.rb

class Recording < ApplicationRecord
    belongs_to :camera
    default_scope { where(archived_at: nil) }
end

以下是输出查询:

irb(main):088:0> User.first.recordings
User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
Recording Load (0.1ms)  SELECT "recordings".* FROM "recordings" INNER JOIN "cameras" ON "recordings"."camera_id" = "cameras"."id" WHERE "cameras"."user_id" = ? AND "recordings"."archived_at" IS NULL  [["user_id", 1]]
 类似资料:
  • 我已经两天没有解决AR协会的问题了。我知道有一个简单的解决办法,但我想不出来。 我有两个模型,产品和用户,应该联系在一起。一个产品应该属于一个用户,一个用户应该有很多产品。我没有在控制器中设置用户变量,所以我选择了habtm关联。以下是模型: User.rb Product.rb products\u控制器。rb型 _形式。html。erb公司 架构。rb型 所以,即使我知道,用户和产品之间应该有

  • 问题内容: 说,我有一个整数,我想取消设置第三个位;如果有,我仍然会得到; 我该如何实现? 问题答案: 假设您正在从右边索引位,这应该可以取消设置以下位置中的特定位: 您可以使用类似的代码来设置该位: 哪里是像以前一样。(这假定位索引从0开始。)

  • 问题内容: 有没有办法一次插入多个记录而不是一次插入? 我有一个非常丑陋的耙子任务,正在做以下事情… 这必须非常低效,并且必须有更好的方法… 问题答案: 该方法也将数组作为参数。 但是,它仍然对每个条目执行一个SQL查询,而不是单个SQL查询。它效率更高,因为它只需要在后台创建一个activerecord对象。 如果要同时从同一客户端插入许多行,请使用带有多个VALUES列表的INSERT语句一次

  • 问题内容: 现在我有这行: 但是,由于程序属于公司,我想显示公司名称而不是公司ID。 渲染程序时如何包括公司名称? 问题答案: 这样的事情应该起作用:

  • 问题内容: 我有这种关系:一个用户可以有零只或一只狗,但是一只狗必须属于某人。 我想定义以下范围: 我可以在第一种情况下执行此操作,因为默认情况下,在rails中,联接是INNER JOIN: 1 /这种针对第一个示波器的解决方案是否足够好? 2 /第二个课程你会做什么? 3 /(有一些关联)是否有更好的方法?: 谢谢你的帮助! 问题答案: 对于问题2,我认为以下方法应该有效: 其中include

  • 我在这上面花了太多的时间,我自己也弄不明白。 我正在编写一些使用一些模块的代码,所以我想为我的消息创建一个特定的日志记录器,而不是其他模块的日志记录器(它们太多了,所以我不想为每个模块设置不同的级别)。 我将我的用例简化为: 当我执行前面的代码时,我希望记录我的信息消息。 结果我得到了: 与相同,它总是打印警告/错误/关键消息,而不是debug/info。 如果我提高了日志记录级别(假设),它会按