0

Я пытаюсь создать способ для пользователей, которым нравится контент в моем проекте. Для этого я создал полиморфной отношения следующим образомПолучить все связанные экземпляры из has_many через взаимосвязь полиморфного класса

Нравится таблица

table "likes", force: :cascade do |t| 
    t.integer "likeable_id" 
    t.string "likeable_type" 
    t.integer "user_id",  null: false 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

моделям

class User < ActiveRecord::Base 
    has_many :likes, dependent: :destroy 
    has_many :newsletters, through: :likes, source: :likeable, source_type: "newsletter" 
    has_many :gift_cards, through: :likes, source: :likeable, source_type: "gift_card" 
    has_many :stories, through: :likes, source: :likeable, source_type: "story" 
end 

class Like < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :likeable, polymorphic: true 
end 

class Newsletter < ActiveRecord::Base 
    has_one :like, as: :likeable, dependent: :destroy 
    has_one :user, through: :like, source: :likeable 
end 

class GiftCard < ActiveRecord::Base 
    has_many :likes, as: :likeable, dependent: :destroy 
    has_many :users, through: :likes, source: :likeable 
end 

class Story < ActiveRecord::Base 
    has_many :likes, as: :likeable, dependent: :destroy 
    has_many :users, through: :likes, source: :likeable 
end 

tldr: пользователь имеет много Нравится и многие информационные бюллетени, Подарочные карты и истории через те лайков ,

Мой вопрос, с этой структурой, какой лучший способ получить все, что понравилось пользователю?

ответ

0

Закончено. Просто были некоторые небольшие синтаксические ошибки

class User < ActiveRecord::Base 
    has_many :likes, dependent: :destroy 
    has_many :newsletters, through: :likes, source: :likeable, source_type: "Newsletter" 
    has_many :gift_cards, through: :likes, source: :likeable, source_type: "GiftCard" 
    has_many :stories, through: :likes, source: :likeable, source_type: "Story" 
end 

class Like < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :likeable, polymorphic: true 
end 

class Newsletter < ActiveRecord::Base 
    has_one :like, as: :likeable, dependent: :destroy 
    has_one :user, through: :like 
end 

class GiftCard < ActiveRecord::Base 
    has_many :likes, as: :likeable, dependent: :destroy 
    has_many :users, through: :likes 
end 

class Story < ActiveRecord::Base 
    has_many :likes, as: :likeable, dependent: :destroy 
    has_many :users, through: :likes 
end 
1

Для меня это чрезвычайно сложно для домена, а на самом деле довольно просто. Возможно, у вас есть большая причина реализовать это именно так, но вот мое предложение для моделей UserLike и GiftCard (что может или не поможет!).

class User < ActiveRecord::Base 
    has_many :likes, dependent: :destroy 
    has_many :liked_giftcards, through: :likes, source: :giftcard 
end 

class Like < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :giftcard 
end 

class GiftCard < ActiveRecord::Base 
    has_many :likes, dependent: :destroy 
end 

class Story < ActiveRecord::Base 
    ...same as GiftCard 
end 

Лично мне было бы легче следовать. Он обеспечивает легкий доступ ко всему, что понравилось пользователю через user.likes, и позволяет просматривать каждую категорию по отдельности через user.liked_giftcards и т. Д.

+0

Закончилось это, но спасибо за помощь! – SomeSchmo

+0

Отлично! Пожалуйста, добавьте свой ответ! –

Смежные вопросы