2017-01-07 2 views
1

Я пытаюсь реализовать систему Group, в которой пользователь может создать группу и другие пользователи, которые могут присоединиться к группе.Ruby on Rails - пользователи в группах

class User < ApplicationRecord 
    has_many :groups 
end 

class Group < ApplicationRecord 
    belongs_to :owner, :class_name => "User" 
    has_many :members, :class_name => "User" 
end 

При проверке владельца, я могу успешно использовать:

<% if current_user == @group.owner %> 

Но я не в состоянии проверить членов группы с:

<%= @group.members.count %> 

Как я бегу в ошибка:

SQLite3::SQLException: no such column: users.group_id: SELECT COUNT(*) FROM "users" WHERE "users"."group_id" = ? 

Я думаю это имеет какое-то отношение к настройке моих пользователей, но не может понять это.

Кроме того, как только я смогу иметь список, содержащий всех пользователей, которые «присоединились» к группе, как мне добавить/удалить пользователей?

Спасибо.

+0

'has_many: members,: class_name =>« Пользователь »' будет ожидать таблицу «group_id» в таблице пользователей, это именно то, что говорит об ошибке. – Abhi

+0

вам нужно добавить внешний ключ ('group_id') в таблицу' users', чтобы получить ссылку от соответствующей модели 'Group' – sa77

ответ

2

Есть две возможности:

One User can belong to Many Groups

Если один пользователь будет принадлежать только одной группе, которая ваша ассоциация говорит, то вам нужно добавить group_id атрибут в User модели или users таблицы, которая будет определять, в какой группе пользователь принадлежит. В настоящее время у вас нет этого столбца, поэтому он бросает исключение. Что касается owner, у вас есть owner_id в таблице Group, которая дает вам owner, который является объектом User.

User - group_id 
Group - owner_id 

Но таким образом, вы будете иметь только один group связанный с User, так что ваш has_many :groups нет никакой пользы в User модели. Для того, чтобы иметь несколько вам нужен другой столик между:

One User will belong to only One Group

Если один пользователь может принадлежать нескольким группам, то вам нужно создать еще одну модель, как UserGroups, которая будет иметь user_id и group_id и ассоциации будут идти, как это:

class User < ActiveRecord::Base 
    has_many :user_groups 
    has_many :groups, through: :user_groups 
end 

class Group < ActiveRecord::Base 
    has_many :user_groups 
    has_many :users, through: :user_groups #This can be members also using `class_name` 
end 

class UserGroup < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 
+1

Мне удалось получить эту работу, также ссылаясь на этот вопрос/ответ, http://stackoverflow.com/questions/5639202/how-do-i-create-a-join-action-between-a-group-and-user –

1

Пользователь также принадлежит к группе (вы забыли это). В вашей групповой схеме вам нужен идентификатор группы, так что после создания группы другие пользователи могут присоединиться к этой конкретной группе. И владелец, и член должны иметь тип «ссылки» в вашей схеме. С этим вам все будет в порядке.

+0

Не могли бы вы добавить код, чтобы показать пример? Я очень новичок в Rails, и мне тяжело. –