2016-08-30 4 views
1

Ich habe das Kommentar-Modell, das zu einigen anderen Modellen wie Post, Seite usw. und has_one gehört (oder gehört zu?) Benutzermodell. Aber ich muss den User auch kommentieren, also muss der User viele Kommentare von anderen Usern haben (das ist polymorph: kommentierbare Assoziation) und er muss seine eigenen Kommentare haben, die von ihm geschrieben wurden. Was ist der beste Weg, um eine Assoziation so zu machen? Wie kann ich Kommentare für Benutzer in einem Controller lesen und erstellen, wenn der Benutzer zwei verschiedene Verknüpfungen mit Kommentaren hat? Jetzt mache ich das und es ist nicht richtig, ich denke:Rails polymorphe Assoziation und has_many für das gleiche Modell

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    has_many :comments, as: :commentable 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :commentable, polymorphic: true 
    belongs_to :user 
end 

class CreateComments < ActiveRecord::Migration 
    def change 
    create_table :comments do |t| 
     t.text :content 
     t.references :commentable, polymorphic: true, index: true 
     t.belongs_to :user 
     t.timestamps null: false 
    end 
    end 
end 

Antwort

3

Sie werden einen anderen Namen für diesen Verein verwenden möchten.

has_many :comments, as: :commentable 
has_many :commented_on, class_name: 'Comment' # you might also need foreign_key: 'from_user_id'. 

See has_many's documentation online.

Die foreign_key sollte in Ihrem Fall nicht benötigt werden, aber ich zeige es Just In Case ™. Rails werden standardmäßig "{class_lowercase} _id" erraten (also user_id in einer Klasse namens User).

Dann können Sie auf beide Zuordnungen zugreifen (Die class_name wird explizit benötigt, da Rails Comment von commented_on nicht finden kann).

Verwandte Themen