Как добавить новую запись в множественную ассоциацию has_many? - PullRequest
0 голосов
/ 05 мая 2010

Я не уверен, что делаю это правильно.

У меня есть 3 модели: Учетная запись, Пользователь и Событие.

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

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

Я создал следующие миграции и модели.


Миграция пользователя

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.integer     :account_id
      t.string      :username
      t.string      :password
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

Миграция аккаунта

class CreateAccounts < ActiveRecord::Migration
  def self.up
    create_table :accounts do |t|
      t.string      :name
      t.timestamps
    end
  end

  def self.down
    drop_table :accounts
  end
end

перенос событий

class CreateEvents < ActiveRecord::Migration
  def self.up
    create_table :events do |t|
      t.integer     :account_id
      t.integer     :user_id
      t.string      :name
      t.string      :location
      t.timestamps
    end
  end

  def self.down
    drop_table :events
  end
end

Модель счета

class Account < ActiveRecord::Base
  has_many      :users
  has_many      :events
end

Модель пользователя

class User < ActiveRecord::Base
  belongs_to    :account
end

Модель события

class Event < ActiveRecord::Base
  belongs_to    :account
  belongs_to    :user
end

так ....

  1. Правильно ли настроен этот параметр?
  2. Каждый раз, когда пользователь создает новую учетную запись, система запрашивает информацию о пользователе, например, имя пользователя и пароль. Как я могу добавить их в правильные таблицы?
  3. Как я могу добавить новое событие?

Я прошу прощения за такой длинный вопрос. Я не очень понимаю путь рельсов в обработке такой структуры данных. Спасибо, ребята, что ответили мне. :)

1 Ответ

2 голосов
/ 05 мая 2010

Это похоже на работу для 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.

С уважением, и удачи!

...