我需要通过多态关系检索多个对象,最好是单个查询。Rails 5:通过多态关系检索多个对象
在用户模式我有这样的:
class User < ApplicationRecord
has_many :companies, through: :accounts
has_many :permissions
has_many :medias, class_name: 'Media::Medias', through: :permissions,
source: :permitable, source_type: 'Media::Medias'
end
然后我权限模型看起来是这样的:
class Permission < ApplicationRecord
belongs_to :permitable, polymorphic: true
belongs_to :user, optional: true
end
媒体::媒体模式:
module Media
class Medias < ApplicationRecord
belongs_to :companies, optional: true, inverse_of: :medias
has_many :permissions, class_name: 'Permission', as: :permitable
has_many :users, through: :permissions
end
end
公司模式:
class Company < ApplicationRecord
has_many :accounts, dependent: :destroy
has_many :users, through: :accounts
has_many :medias, class_name: 'Media::Medias', inverse_of: :company
end
如何返回ActiveRecord::Relation object
所有媒体的current_user
和公司每个媒体?重要的是,我必须通过Permission
模式使用关系,我不应该通过Accounts
得到公司。到目前为止,我已经建立了模型,因此我可以使用Current.user.medias
获取所有媒体的current_user
。
谢谢!
更新
以下是我从几个版本的我试过了:
[4] pry(main)> user.medias.includes(:companies).map{|media| media.companies.id }
Media::Medias Load (1.4ms) SELECT "media_medias".* FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
NameError: uninitialized constant Media::Medias::Companies
from /home/ubuntu/.rvm/gems/ruby-2.3.3/gems/activerecord-5.1.0/lib/active_record/inheritance.rb:166:in `compute_type'
[5] pry(main)> user.medias.preload(:companies).select(['medias.id', 'medias.company.id'])
Media::Medias Load (1.3ms) SELECT medias.id, medias.company.id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
=> #<Media::Medias::ActiveRecord_AssociationRelation:0x33dd094>
[6] pry(main)> user.medias.select(['medias.id', 'medias.company_id'])
Media::Medias Load (1.1ms) SELECT medias.id, medias.company_id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
=> #<Media::Medias::ActiveRecord_AssociationRelation:0x3413234>
更新2
[4] pry(main)> puts user.medias.preload(:companies).select(['medias.id', 'medias.company.id'])
Media::Medias Load (1.4ms) SELECT medias.id, medias.company.id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "medias"
LINE 1: SELECT medias.id, medias.company.id FROM "media_medias" INNE...
^
: SELECT medias.id, medias.company.id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2
from /home/ubuntu/.rvm/gems/ruby-2.3.3/gems/activerecord-5.1.0/lib/active_record/connection_adapters/postgresql_adapter.rb:620:in `async_exec'
[5] pry(main)> puts user.medias.select(['medias.id', 'medias.company_id'])
Media::Medias Load (1.2ms) SELECT medias.id, medias.company_id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "medias"
LINE 1: SELECT medias.id, medias.company_id FROM "media_medias" INNE...
^
: SELECT medias.id, medias.company_id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2
from /home/ubuntu/.rvm/gems/ruby-2.3.3/gems/activerecord-5.1.0/lib/active_record/connection_adapters/postgresql_adapter.rb:620:in `async_exec'
更新3
[1] pry(main)> User.find(2).medias.preload(:companies).select(['medias.id', 'medias.company.id'])
User Load (21.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
Media::Medias Load (1.7ms) SELECT medias.id, medias.company.id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
=> #<Media::Medias::ActiveRecord_AssociationRelation:0x17688f0>
[2] pry(main)> User.find(2).medias.select(['medias.id', 'medias.company_id'])
User Load (1.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
Media::Medias Load (1.8ms) SELECT medias.id, medias.company_id FROM "media_medias" INNER JOIN "permissions" ON "media_medias"."id" = "permissions"."permitable_id" WHERE "permissions"."user_id" = $1 AND "permissions"."permitable_type" = $2 [["user_id", 2], ["permitable_type", "Media::Medias"]]
=> #<Media::Medias::ActiveRecord_AssociationRelation:0x2155d90>
你什么的'current_user.medias.includes(:公司)'? –
@ Md.FarhanMemon我在console中看到:'[2] pry(main)> user.medias.includes(:companies) Media :: Medias Load(1.6ms)SELECT“media_medias”。* FROM“media_medias”INNER JOIN“permissions”ON“media_medias”。“id”=“permissions”。“permitable_id”WHERE“permissions”。“user_id”= $ 1 AND“permissions”。“permitable_type”= $ 2 [[“user_id”,2] “媒体::媒体”]] =>#' –
matiss
@ Md.FarhanMemon它看起来没有给我想要的结果+我需要找回两个 - 媒体和公司。 – matiss