In Ihrem Schema hat eine Liste eine Benutzer-ID und eine Überprüfungs-ID. Eine Liste kann also nur eines dieser Dinge haben. Aber Sie möchten, dass ein Benutzer nur eine Liste hat, während die Liste viele Bewertungen hat.
Es wird dann komplexer, weil eine Liste viele Bewertungen haben kann. Da jedoch viele verschiedene Benutzer Bewertungen in ihre eigenen Listen aufnehmen können, wird eine Überprüfung möglicherweise in mehreren Listen angezeigt. Kurz gesagt, Liste has_and_belongs_to_many :reviews
und Überprüfung has_and_belongs_to_many :lists
. Das bedeutet, dass Sie das Paar ID-ID und Überprüfungs-ID, das diese Beziehung ausdrückt, irgendwo anordnen müssen - es heißt Join-Tabelle. Die Konvention ist nur die beiden Namen der verbundenen zwei Tabellen verketten, um den Namen der Join-Tabelle zu erhalten - wenn wir die Tabellen lists
und reviews
haben, benötigen wir eine Join-Tabelle namens lists_reviews
(Sie können dies überschreiben, aber es ist einfacher, einfach mit zu gehen Das Treffen).
würde eine absolute Minimum Rails Migration sein: Die
create_table :users do |t|
end
create_table :lists do |t|
t.belongs_to :user # Leads to "user_id" column
end
create_table :reviews do |t|
end
create_table :lists_reviews do |t|
t.belongs_to :list # Leads to a "list_id" column
t.belongs_to :review # Leads to a "review_id" column
end
gegeben, und da auch sie hat, mit #has_one
du sollte #belongs_to
in der Sache stellen, so Liste sollte belong_to :user
, erhalten wir:
class User < ActiveRecord::Base # Rails <= v4
has_one :list
has_many :reviews, :through => :list
end
class List < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :reviews
end
class Review < ActiveRecord::Base
has_and_belongs_to_many :lists
has_many :users, :through => :lists
end
Und damit alles in eine leere Rails abgeladen schälen wir es an der Konsole testen können:
u1 = User.new; u1.save!
u2 = User.new; u2.save!
l1 = List.new(user: u1); l1.save!
l2 = List.new(user: u2); l2.save!
r1 = Review.new; r1.save!
r2 = Review.new; r2.save!
r3 = Review.new; r3.save!
l1.reviews << r1
l1.reviews << r2
l1.save!
l2.reviews << r2
l2.reviews << r3
l2.save!
u1.list
# => #<List id: 1, user_id: 1>
u1.list.reviews
# => #<ActiveRecord::Associations::CollectionProxy [#<Review id: 1>, #<Review id: 2>]>
u2.list
# => #<List id: 2, user_id: 2>
u2.list.reviews
# => #<ActiveRecord::Associations::CollectionProxy [#<Review id: 2>, #<Review id: 3>]>
l1.user
# => #<User id: 1>
l2.user
# => #<User id: 2>
r1.users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1>]>
r1.lists
=> #<ActiveRecord::Associations::CollectionProxy [#<List id: 1, user_id: 1>]>
r2.users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 1>, #<User id: 2>]>
r2.lists
=> #<ActiveRecord::Associations::CollectionProxy [#<List id: 1, user_id: 1>, #<List id: 2, user_id: 2>]>
r3.users
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 2>]>
r3.lists
=> #<ActiveRecord::Associations::CollectionProxy [#<List id: 2, user_id: 2>]>
... es funktioniert.
Bitte vereinfachen Sie Ihre Frage als was suchen Sie ..? – Milind
Entschuldigung. Ich versuche, eine Liste in meiner Anwendung zu erstellen, die Rezensionen aus meinem Bewertungsmodell enthält. Jeder Benutzer hat eine Liste, die mehrere Bewertungen haben kann. Ich bin fest, wie ich meine Assoziationen zu machen. Meine Liste Tabelle ist die verbundene Tabelle mit review_id und user_id. Derzeit, wenn ich versuche, auf die Bewertungen in einer Benutzerliste zuzugreifen, bekomme ich diesen Fehler - o solche Spalte: reviews.list_id – hangloos
Macht das mehr Sinn? Entschuldigung für die Verwirrung. – hangloos