Это похоже на работу для has_many: через (прокрутите вниз, чтобы найти параметр :through
)
Если вам нужно знать пользователя, который создал событие, то вам следует указать, что Событие действительно принадлежит только пользователю:
class Event < ActiveRecord::Base
belongs_to :user
end
Однако учетные записи могут «захватывать» события своих пользователей. Вы указываете, что так:
class User < ActiveRecord::Base
belongs_to :account
end
class Account < ActiveRecord::Base
has_many :users
has_many :events, :through => :users
end
Миграции будут такими же, как вы написали для Account
и User
. Для Event
вы можете удалить account_id
:
class CreateEvents < ActiveRecord::Migration
def self.up
create_table :events do |t|
t.integer :user_id
t.string :name
t.string :location
t.timestamps
end
end
def self.down
drop_table :events
end
end
Тогда ваши события могут быть созданы так:
# These two are equivalent:
event = user.events.create(:name => 'foo', :location => 'bar')
event = Event.create(:user_id => user.id, :name => 'foo', :location => 'bar')
Обратите внимание, что это сразу же создаст и сохранит событие. Если вы хотите создать событие без сохранения, вы можете использовать user.events.build
или Event.new
.
has_many :through
в Аккаунтах позволит вам получить все события для одного аккаунта:
user.events # returns the events created by one user
account.events # returns all the events created by the users of one account
user.account.events # returns the events for the user's account
В качестве последнего замечания, обратите внимание, что вы много изобретаете колесо здесь. Существуют довольно хорошие решения для управления пользователями и разрешениями.
Я рекомендую вам посмотреть devise ( railscast ) или authlogic ( railscast ) для управления своими счетами, и Declarative_authorization ( railscast ) или cancan ( railscast ) для управления разрешениями. Мой личный выбор - разработка и декларативное_авторизация. Первый легче установить, чем authlogic, а второй более мощный, чем cancan.
С уважением, и удачи!