【问题标题】:Rails - Relation passed to #or must be structurally compatible. Incompatible values: [:joins]Rails - 传递给 #or 的关系必须在结构上兼容。不兼容的值:[:joins]
【发布时间】:2021-10-24 03:54:31
【问题描述】:

我想在我的 rails 应用程序中合并两个查询。每一个都不是很复杂,但是我不能合并它们。

owner_packages = Package.where(owner: current_user)
admins_packages = current_user.managed_packages
@managable_packages = owner_packages.or(admins_packages)

用户.rb

has_many :package_admins, dependent: :destroy
has_many :managed_packages, through: :package_admins, source: :package

package.rb

  has_many :package_admins, dependent: :destroy
  has_many :admins, through: :package_admins, source: :user

我遇到了这个错误:

传递给#or 的关系必须在结构上兼容。不相容 值:[:joins]

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    我认为您正在寻找的是子选择:

    owner_packages = Package.where(owner: current_user)
    admins_packages = current_user.managed_packages
    @managable_packages = owner_packages.or(Package.where(id: admins_packages))
    

    这段代码真的应该移到模型中,而不是让所有的电线都悬空:

    class User < ApplicationRecord
      has_many :owned_packages, class_name: 'Package',
                                foreign_key: :owner_id # just guessing here
      has_many :package_admins, dependent: :destroy
      has_many :managed_packages, through: :package_admins, source: :package
    
    
      def managable_packages 
        owned_packages.or(Package.where(id: managed_packages))
      end
    end
    

    另一种方法是使用联合:

    class User < ApplicationRecord 
      # ...
    
      def managable_packages
        Package.from(
          owned_packages.arel.union(managed_packages.arel).as('packages')
        )
      end
    end
    

    【讨论】:

    • 完美,谢谢!这正是我所需要的!
    猜你喜欢
    • 2019-06-26
    • 2018-02-25
    • 2021-01-22
    • 2017-04-06
    • 2019-12-16
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多