2016-09-20 5 views
0

Я пытаюсь написать приложение, которое позволяет пользователям регистрироваться для событий. Каждое событие имеет своего владельца и пользователей, которые планируют посетить мероприятие. У меня возникли проблемы с выбором правильной ассоциации для последней. Я пробовал has_and_belongs_to_many, но где-то читал, что его не рекомендуется использовать, поэтому я попытался использовать has_many: through и, похоже, не работает. Это то, что я придумал сейчас:Какую Rails-ассоциацию следует использовать?

class User < ApplicationRecord 
    has_secure_password 

    has_many :events, :foreign_key => :owner_id 
    has_many :event_users 
    has_many :events, :through => :event_users 
end 

class Event < ApplicationRecord 
    belongs_to :user, :foreign_key => :owner_id 
    has_many :event_users 
    has_many :users, :through => :event_users 
end 

class EventUser < ApplicationRecord 
    has_many :users 
    has_many :events 
end 

И код подключений выглядит следующим образом:

def sign_up 
    user = User.find(session[:user_id]) 
    @event.users << user 
end 

Этот код возвращает ошибку:

Cannot modify association 'Event#users' because the source reflection class 'User' is associated to 'EventUser' via :has_many. 

Может вы, ребята, скажите мне что я делаю неправильно и как это делать правильно? Это мое первое серьезное приложение Rails, и я действительно хочу написать его правильно. Заранее спасибо.

ответ

0

Возможно, вы захотите отличить владельца от гостей. Я хотел бы сделать это:

#models/event.rb 
    belongs_to :owner, class_name: "User" 
    has_many :guests, class_name: "User", through: :event_users 
    has_many :event_users 

#models/eventuser.rb 
    belongs_to :users 
    belongs_to :events 

#models/user.rb 
    has_many :event_users 
    has_many :events, through: :event_users 
    has_many :event_ownerships, class_name: "Event" 

супер важный момент здесь EventUser (ы) belongs_to иметь отношения многие ко многим вы указали.

Кроме того, вы не можете переопределить ассоциацию user.events, вам необходимо переименовать его.