Как получить связанные полиморфные объекты в рельсах 5? - PullRequest
0 голосов
/ 08 октября 2018

В моей модели Post у меня есть

has_many :followers

В моей модели Follower у меня есть

belongs_to :model
belongs_to :owner,polymorphic: true

В моих моделях пользователей и администраторов у меня есть

has_many :followers,as: :owner

Требование: Я хочу получить что-то вроде Post.owners, и он должен вернуть мне список всех пользователей и / или администраторов, которые следят за этим постом.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Решение, которое вы ищете, полиморфное, имеет много сквозного.Вы можете добавить эти строки в вашу модель User и Admin.

has_many :followers
has_many :posts, through: :followers, source: :owner, source_type: 'Owner'
0 голосов
/ 08 октября 2018

Я думаю, вы хотите что-то вроде этого:

class Post < ApplicationRecord
  belongs_to :owner, polymorphic: true
end

class User < ApplicationRecord
  has_many :posts, as: :owner
end

class Follower < ApplicationRecord
  has_many :posts, as: :owner
end

Из экземпляра вашего пользователя вы можете получить его сообщения с помощью @ user.posts То же самое относится и к вашему последователю, @ follower.posts

Если вы хотите добраться до родителя вашего экземпляра записи, вы можете сделать это через @ post.owner.Однако, чтобы это работало, нам нужно правильно настроить схему, объявив в модели столбец внешнего ключа и столбец типа, который объявляет полиморфный интерфейс с помощью формы ссылок:

class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      # your attribs here
      t.references :owner, polymorphic: true, index: true
    end
  end
end
0 голосов
/ 08 октября 2018

Я не уверен, но я думаю, что AR не предоставляет способ загрузить полиморфные ассоциации в одном запросе.Но вы можете использовать:

post = Post.find(1)
post_followers = post.followers.includes(:owner)
post_owners = post_followers.map(&:owner)
...