2016-07-12 15 views
0

Ich habe User und Review Modelle. Eine Überprüfung kann hat ein author und ein subject, die beide auf dem Hinweis ein User:Wie wird diese assignes_to Verbindung in Rails/ActiveRecord eingerichtet?

class Review < ApplicationRecord 
    belongs_to :subject, class_name: 'User', optional: true 
    belongs_to :author, class_name: 'User', optional: true 
end 
class CreateReviews < ActiveRecord::Migration[5.0] 
    def change 
    create_table :reviews do |t| 
     t.references :subject 
     t.references :author 
    end 
    end 
end 

Dies funktioniert gut, und jetzt kann ich zwei separate User Objekte das Review Objekt zuweisen zu vertreten, die die Kritik gegen die schrieb.

Der Benutzer weiß jedoch nicht, wie viele Bewertungen er entweder als Thema oder der Autor zugeordnet ist. Ich fügte has_and_belongs_to_many :users auf Bewertungen und umgekehrt hinzu, und obwohl machbar, ist nicht genau das, was ich will.

Wie richte ich die Verbände bis zu der Lage sein, folgendes zu tun:

review.author = some_other_user 
review.subject = user2 
another_review.author = some_other_user 
another_review.subject = user2 

user2.a_subject_in.count 
#=> 2 
user2.a_subject_in 
#=> [#<Review>, #<Review>] 
some_other_user.an_author_in.count 
#=> 2 

Mit anderen Worten: Wie kann ich sehen, wie oft ein User wurde als Autor oder Thema für ein Modell gespeichert mit belongs_to?

Antwort

4

WENN Sie has_many Verband auf Benutzer Seite verwenden möchten, müssen Sie zwei separate has_many Beziehungen wie

class User < ApplicationRecord 
    has_many :reviews, foreign_key: :author_id 
    has_many :subject_reviews, class_name: 'Review', foreign_key: :subject_id 
end 

Jetzt definieren mit dies können Sie einfach verwenden

irb(main):033:0> s.reviews 
    Review Load (0.2ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."author_id" = ? [["author_id", 1]] 
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: 1, comment: "random", subject_id: 2, author_id: 1, created_at: "2016-07-12 01:16:23", updated_at: "2016-07-12 01:16:23">]> 
irb(main):034:0> s.subject_reviews 
    Review Load (0.2ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."subject_id" = ? [["subject_id", 1]] 
=> #<ActiveRecord::Associations::CollectionProxy []> 

Kommentar: subject_reviews ist kein guter Name :), ändern Sie es nach Ihren Anforderungen.

+0

Genau das, was ich wollte, danke –

0

Ich glaube, du bist für diese Abfrage suchen:

class User 
    def referenced_in 
    # this fetches you all the reviews that a user was referenced 
    Review.where("reviews.author_id = :user_id OR reviews.subject_id = :user_id", user_id: id).distinct 
    end 
end 

User.first.referenced_in #should give you all records a user was referenced 
Verwandte Themen