2015-07-10 4 views
0

Я преподаю Rails, и я пытаюсь настроить такие отношения сотрудничества, как Github добавляет коллабораторов к проектам. Мои модели выглядят следующим образом:Настройка связи между пользователями для доступа к ресурсу

class Restaurant < ActiveRecord::Base 
    has_many :employees 
    has_many :users, through: :employees 
end 

class User < ActiveRecord::Base 
    has_many :employees 
    has_many :restaurants, through: :employees 
end 

class Employee < ActiveRecord::Base 
    belongs_to :restaurant 
    belongs_to :user 
end 

стол Работник также имеет столбец user_type для обработки разрешений в рамках проекта (ресторан). Я не могу понять, как заставить мой employee_controller установить это отношение. Первичный ключ пользователя: электронная почта, поэтому я предполагаю, что форма должна иметь возможность получить параметр: email, проверить, существует ли такой пользователь с введенным адресом электронной почты, и добавить отношение к таблице сотрудников.

Я ищу, чтобы быть в состоянии сделать что-то вроде этого:

Restaurant_A = Restaurant.create(restaurant_params) 
User_A.restaurants = Restaurant_A 
Restaurant_A.employees = User_B 

Я думаю, что мои модели могут быть неправильно, но в основном я хотел бы иметь возможность пользователям возможность создавать ресторан а также быть добавленными в качестве сотрудников другого ресторана/собственных ресторанов.

ответ

1

Ваша модель в порядке - никаких проблем с этим.

То, что вы пытаетесь достичь, вы можете сделать что следующее:

restaurant_a = Restaurant.create(restaurant_params) 
# Remember to name it 'restaurant_a', it is convention in Ruby 
user_a.restaurants << restaurant_a 

<< является оператором, который вставляет левостороннюю вещь в ее правую руке вещь. Таким образом, в нашем случае он введет restaurant_a в список restaurants, которые связаны с user_a, а затем вы вызываете save на вашем user_a, как user_a.save.

же случай с другой стороны:

restaurant_a.employees << user_b 
# According to Ruby convention, you shouldn't start your variable 
# name with an upper case letter, and you should user a convention 
# called 'snake_type' naming convention. So instead of naming 
# your variable like 'firstDifferentUser', name it 'first_different_user' 
# instead. 
restaurant_a.save # To successfully save the record in db 

Edit:

Для создания формы:

<%= form_for(@restaurant, @employee) do |f| %> 
    <%= f.label :email %> 
    <%= f.text_field :email %> 
<% end %> 

И вам нужно определить @restaurant и @employee в ваших сотрудников контроллер new, потому что вы собираетесь создать нового сотрудника для определенного r оран.

+0

Вижу, спасибо Арслан :). Управляется, чтобы сделать первую часть при создании ресторана. Сообщите, если я застрял на другой стороне ассоциации при добавлении сотрудников. –

+0

Определенно застрял. Не возражаете ли вы рассказать мне, как бы вы продвинулись и создать форму для получения параметра: email в Rails 4? После этого я предполагаю, что могу сделать что-то в соответствии с User.find_by (электронная почта: params [: email]) –

+0

Вам нужна форма, в которой пользователь мог бы прийти, поместить свой адрес электронной почты и затем нажать кнопку отправки? Так вы хотите получить параметр 'email'? –