ruby-on-rails - 如何为属于其他两个模型的模型编写范围并排除具有匹配外键的所有记录
问题描述
我想为一个属于其他两个模型的模型编写一个范围。此范围应选择一个模型的值不等于其父模型的值的所有记录。我在下面的内容似乎应该可以工作:
Class Blob
belongs_to :user
belongs_to :item
scope: :not_owned_by_item_owner, -> { where.not(user_id: item.owner.id) }
end
但是随后调用blob.not_owned_by_item_owner
控制器中的任何位置都会undefined local variable or method
导致item
. 为什么item
不被认可?
解决方案
解决方案 1
scope :not_owned_by_item_owner, -> {
joins(:item).where.not(
Blob.arel_table[:user_id].eq(Item.arel_table[:owner_id])
)
}
# SELECT "blobs".* FROM "blobs" INNER JOIN "items" ON "items"."id" = "blobs"."item_id" WHERE "blobs"."user_id" != "items"."owner_id"
解决方案 2
或者如果您更喜欢原始 SQL:
scope :not_owned_by_item_owner, -> {
joins(:item).where('blobs.user_id != items.owner_id')
}
# SELECT "blobs".* FROM "blobs" INNER JOIN "items" ON "items"."id" = "blobs"."item_id" WHERE (blobs.user_id != items.owner_id) LIMIT $1
PS我认为没有ActiveRecord
本机解决方案,但如果有人找到我也很感兴趣。上述方案一Arel
直接使用。
推荐阅读
- r - 比较几个表并创建一个新表,显示哪些变量使用 R 匹配
- mysql - 我正在寻找一种方法来消除列中的重复值,同时在 MySQL 中使用 row_number over 、 partition by
- log4j2 - 如何更改包含库中的日志记录级别?
- c++ - Visual Studio 2019:如果不先将其导入单独的模块 (ixx) 中,则无法在 cpp 文件中“导入”C++ 标准库声明
- github - 如何更改 GitHub 应用程序的 Heroku 堆栈?
- r - 如何创建函数以轻松多次操作数据?
- ios - Swift:添加子视图会阻止用户使用该应用程序。洛蒂动画
- flutter - 如何仅使用颤振制作自定义加载小部件
- node.js - VS Code 在断点处以只读方式打开文件
- javascript - 无法从 localhost 以外的任何地方向 Node.js HTTP Webserver 发送 POST 请求