Rails - 传递给#or 的关系必须在结构上兼容。不兼容的值:[:joins]
Rails - Relation passed to #or must be structurally compatible. Incompatible values: [:joins]
我想在我的 rails 应用程序中合并两个查询。每一个都不是很复杂,但我无法将它们合并。
owner_packages = Package.where(owner: current_user)
admins_packages = current_user.managed_packages
@managable_packages = owner_packages.or(admins_packages)
user.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
我 运行 遇到了这个错误:
Relation passed to #or must be structurally compatible. Incompatible
values: [:joins]
我想你要找的是子选择:
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
我想在我的 rails 应用程序中合并两个查询。每一个都不是很复杂,但我无法将它们合并。
owner_packages = Package.where(owner: current_user)
admins_packages = current_user.managed_packages
@managable_packages = owner_packages.or(admins_packages)
user.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
我 运行 遇到了这个错误:
Relation passed to #or must be structurally compatible. Incompatible values: [:joins]
我想你要找的是子选择:
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