2017-10-29 5 views
0

Ich habe eine polymorphe Zuordnung in meiner Anwendung, und ich möchte in der Lage sein, die Anzahl der Benutzer in einer Gruppe zu zählen und die Benutzer in jeder Gruppe aufzulisten. Wie kann ich das erreichen?Rails Anzahl der Datensätze in polymorphe Zuordnung

class Group < ApplicationRecord 
    has_many :user_groups 
    has_many :users, through: :user_groups 
end 

class User < ApplicationRecord 
    has_many :user_groups 
    has_many :groups, through: :user_groups 
end 

class UserGroup < ApplicationRecord 
    belongs_to :user 
    belongs_to :group 
end 

ich im Moment kann ich User.first.groups nennen aber ich nicht in der Lage bin User.groups.all und User.all.groups aber keines dieser Arbeit zu nennen.

Antwort

0

Zunächst einmal, das ist keine polymorphe Assoziation. Nur zu deiner Information.

Es ist schwer zu wissen, was Sie fragen, weil die Benutzer in einer Gruppe zu zählen, was Sie tun:

group.users.count 

Wenn Sie sagen: ‚aufzählen‘, meinst du in einer Ansicht? Das wäre so etwas wie:

<%- group.users.each do |user| %> 
    # do something with user 
<% end %> 

einfach auf den Kommentar zu erweitern, wenn die Klasse Image eine polymorphe belongs_to Vereinigung hatte, dass etwas aussehen könnte:

# == Schema Information 
# 
# Table name: images 
# 
# id    :integer   not null, primary key 
# imageable_id  :integer 
# imageable_type :string 
# created_at  :datetime   not null 
# updated_at  :datetime   not null 
# 
class Image < ApplicationRecord 
    belongs_to :imageable, polymorphic: true 
end 

Wie Sie sehen können, die Image Klasse hat die Attribute imageable_id und imageable_type. Dann, wenn Sie Document haben viele images, haben wollte würden Sie gleichen so etwas wie:

class Document < ApplicationRecord 
    has_many :images, as: :imageable 
end  

Dann könnten Sie tun:

image.imageable 

Um das Objekt zu erhalten, dass die image gehört. Um all images für ein document, dann einfach:

document.images 
+0

Was wäre das, wenn nicht eine polymorphe Vereinigung genannt werden? Deine Lösung hat für mich funktioniert. Ich nehme an, ich überlegte. –

+2

Dies ist eine Viele-zu-Viele-Beziehung. Polymorph ist - ein Modell kann effektiv zu mehreren anderen Modellen gehören. Beispiel - Bild kann zu Benutzer oder Dokument gehören. Man könnte also eine Schicht namens 'bebilderbar' im Bild haben, die den Polymorphismus für 'Benutzer' und 'Dokument' darstellt. – kiddorails

+0

Um ein wenig genauer zu sein, mit einer polymorphen Assoziation wie besprochen, kann ein Bildobjekt nur zu einem anderen Objekt gehören. Aber dieses Objekt kann von irgendeiner "Klasse" sein. Wie Sie sagen, zum Beispiel eine Instanz von 'User' oder' Document'. Mit 'gehört_zu: bebilderbar, polymorph: wahr',' bebilderbar' und 'bebilderbar =' sind Methoden, die auf dem 'image' Objekt verfügbar sind, die das Holen/Setzen ermöglichen - was du vielleicht mit 'einer Ebene' meinst. – jvillian

Verwandte Themen