В вашей схеме список имеет один идентификатор пользователя и один идентификатор проверки. Таким образом, в списке может быть только одна из этих вещей. Но вы хотите, чтобы у Пользователя был только один Список, в то время как в Списке много Обзоров.
Затем он становится более сложным, потому что в списке может быть много отзывов. Но поскольку многие пользователи могут помещать обзоры в свои собственные списки, один обзор может отображаться в нескольких списках. Короче говоря, список has_and_belongs_to_many :reviews
и обзор has_and_belongs_to_many :lists
. Это означает, что вам нужно где-то поместить идентификатор списка и идентификатор отзыва, которые выражают это отношение, - это называется таблицей объединения . Соглашение просто объединяет два имени связанных двух таблиц, чтобы получить имя таблицы соединений, поэтому, если у нас есть таблицы lists
и reviews
, нам нужна таблица соединений, которая называется lists_reviews
(вы можете переопределить это, но проще просто пойти с конвенция).
Голый минимум Rails миграции будет:
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
Учитывая это, и учитывая, что с #has_one
вы должны положить #belongs_to
в вещи у него есть, тоже, так что список должен belong_to :user
, мы получим:
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
И все это бросили в пустой Rails оболочки мы можем проверить его на консоли:
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>]>
... это работает.
Пожалуйста, упростите свой вопрос, что вы ищете ..? – Milind
Извините. Я пытаюсь создать список в своем приложении, который включает в себя отзывы из моей модели обзора. У каждого пользователя есть один список, который может иметь несколько обзоров. Я зациклился на том, как сделать мои ассоциации. Моя таблица списка - это объединенная таблица с review_id и user_id. В настоящее время, когда я пытаюсь получить доступ к отзывам в списке пользователей, я получаю эту ошибку - o такой столбец: reviews.list_id – hangloos
В этом смысл? Извините за путаницу. – hangloos