Как загрузить данные в таблицу соединений Ruby on Rails? - PullRequest
0 голосов
/ 12 мая 2009

У меня есть следующая таблица соединений, которая работает:

class CreateRolesUsers < ActiveRecord::Migration
  def self.up
    create_table :roles_users,:id => false do |t|
      t.integer :role_id, :null => false
      t.integer :user_id, :null => false
    end    
  end

  def self.down
    drop_table :roles_users
  end
end

Но я не знаю, как загрузить по умолчанию некоторые данные (синтаксис), я пытаюсь это:

roleUser = RoleUser.create(:role_id => 2,:user_id => 1)
roleUser.save!

Не работает, это RoleUser ... или что-то еще использовать? RolesUser ... и т.д.

Ответы [ 4 ]

2 голосов
/ 12 мая 2009

Это при условии, что у вас есть модель с именем RolesUser.

Если у вас есть ассоциация habtm, модель, вероятно, отсутствует.

Один из способов загрузки ролей может быть;

user = User.create :name => 'John'
role = Role.create :name => 'admin'

user.roles << role
1 голос
/ 12 мая 2009

Насколько я понимаю, у вашего user может быть много roles, верно? Если так ..

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

Тогда вы можете сделать

user = User.create :name => 'John'
role = Role.create :name => 'admin'
roles_users = RolesUser.create :user => user, :role => role

Ассоциация has_and_belongs_to_many создает таблицу соединения с обоими FK. Если вам нужны дополнительные данные в таблице соединений, вам нужно будет использовать has_may :through вместо has_and_belongs_to_many.
Я настоятельно рекомендую прочитать руководство по ассоциациям ActiveRecord . Удачи!

0 голосов
/ 25 ноября 2014

Во-первых, когда у вас есть ассоциация has_and_belongs_to_many, у которой у вас нет модели, у вас есть только таблица базы данных с множественным именем, объединенная из моделей, участвующих в ассоциации, например

class User < ActiveRecord::Base
   has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
   has_and_belongs_to_many :users
end

Вы не получаете модель с именем UserRoles, или UsersRoles, или UsersRole, или какую-либо модель, это только делает некоторые методы, которые вы можете использовать в экземпляре User или Role, чтобы найти для 1 пользователя все его роли или найти всех пользователей с определенной ролью и т. д.

Это работает, так что rails будет искать таблицу базы данных с именем role_users (она ищет таблицу, которая объединяется с обоими именами моделей во множественном числе, упорядочивая по алфавиту, поэтому его role_users, а не users_roles).

Для конкретного пользователя вы можете добавить роли или предопределить существующие, например:

# find one user
user = User.first
# get collection of roles
roles_c = Role.where("some conditional statement to find roles")
# set user roles to found collection
user.roles = roles_c
# save changes
user.save

Таким образом, вы получите записи в таблице role_users с user_id пользователя, и для каждой роли в коллекции role_c будет запись, например:

# if user.id is 1
# and in roles_c you have 3 roles with id_s 2,5 and 34
# in roles_users table there will be created 3 records with

user_id => 1, role_id => 2
user_id => 1, role_id => 5
user_id => 1, role_id => 34

Другой способ - добавить несколько ролей,

user = User.first
roles_c = Role.where('conditional statement')
user.roles << roles_c
user.save
0 голосов
/ 12 мая 2009

Ты почти у цели. Имя таблицы - форма названия модели во множественном числе. Таблица называется RolesUsers, поэтому модель называется RolesUser.

Кроме того, я думаю, что вы бы предпочли использовать метод new, если вы собираетесь вызвать save! после факта. Вызов create автоматически сохраняет запись.

rolesUser = RolesUser.new(role_id => 2,:user_id => 1)
rolesUser.save!

Рекомендуемое чтение: http://api.rubyonrails.org/classes/ActiveRecord/Base.html

...