2017-08-20 2 views
0

Dans mon application, j'ai modèles User, Post, Notification, PostShare & SocialPage.Ruby on Rails - se joint à des modèles pour obtenir des notifications

Voilà comment j'ai mes associations modèles:

class User < ActiveRecord::Base 
    has_many :social_pages 
    has_many :posts 


class Post < ActiveRecord::Base 
    has_many :post_shares 
    has_many :notifications 
    belongs_to :user 


class Notification < ActiveRecord::Base 
    belongs_to :post 


class PostShare < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :social_page 


class SocialPage < ActiveRecord::Base 
    belongs_to :user 
    has_many :post_shares 

Lorsque notifications sont ajoutés, j'ajoute post_id à ma table.

Ce que je veux réaliser est, sur la base de post_idnotifications, je veux trouver post_shares pour que post_id & trouver le social_pages_id & base social_page_id trouver quel utilisateur a propre/créé la page et leur montrer les notifications.

J'ai essayé avec joins comme Notification.joins(:post).group(:post_id).select(:post_id), mais je ne comprends rien.

Toute aide est appréciée!

Répondre

1

Rails imbriquées comprend ou imbriquées les jointures sur ActiveRecord va résoudre votre problème ici

Rails - Nested includes on Active Records?

Vous pouvez faire quelque chose comme ça

notifications = Notification.includes(post: [:user, post_shares: [social_page: :user]]).where(post_id: your_post_id) 

OU

notifications = Notification.joins(post: [post_shares: [social_page: :user]]).where(post_id: your_post_id) 

Et vous avoir accès au post & social utilisateurs de la page comme ceci

post_user = notifications.map(&:post).map(&:user) 

post_shares = [] 
notifications.each do |n| 
    post_shares += n.post.post_shares 
end 

social_page_users = post_shares.map(&:social_page).map(&:user)