Как автоматически назначить роль пользователю, если мое назначение связано с моделью пользователя в сквозном has_many? Рельсы 3 - PullRequest
0 голосов
/ 25 февраля 2011

То, что я хотел бы сделать, - это когда пользователь создается, он автоматически дает ему роль.

Дело в том, что роль связана с пользователем через таблицу назначений и has_many посредством ассоциации.

Код выглядит следующим образом:

User model


# == Schema Information
# Schema version: 20110214082231
#
# Table name: users
#
#  id                   :integer         not null, primary key
#  email                :string(255)
#  encrypted_password   :string(128)
#  password_salt        :string(255)
#  reset_password_token :string(255)
#  remember_token       :string(255)
#  remember_created_at  :datetime
#  sign_in_count        :integer
#  current_sign_in_at   :datetime
#  last_sign_in_at      :datetime
#  current_sign_in_ip   :string(255)
#  last_sign_in_ip      :string(255)
#  username             :string(255)
#  f_name               :string(255)
#  l_name               :string(255)
#  created_at           :datetime
#  updated_at           :datetime
#  invitation_token     :string(60)
#  invitation_sent_at   :datetime
#  plan_id              :integer
#  current_state        :string(255)
#  confirmation_token   :string(255)
#  confirmed_at         :datetime
#  confirmation_sent_at :datetime
#

class User < ActiveRecord::Base
  before_create :assign

  has_many :assignments
  has_many :roles, :through => :assignments

  def role_symbols
    roles.map do |role|
      role.name.underscore.to_sym
    end
  end

  def assign
      @assignment.build_role(:user_id => self.id, :role_id => '3')
  end

end

Assignments model

# Table name: assignments
#
#  id         :integer         not null, primary key
#  user_id    :integer
#  role_id    :integer
#  created_at :datetime
#  updated_at :datetime
#

class Assignment < ActiveRecord::Base
    belongs_to :role
    belongs_to :user
end

Role model


# == Schema Information
# Schema version: 20101117094659
#
# Table name: roles
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  created_at :datetime
#  updated_at :datetime
#

class Role < ActiveRecord::Base
    has_many :assignments
    has_many :users, :through => :assignments
end

1 Ответ

4 голосов
/ 25 февраля 2011

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

Во-вторых, используйте компоновщики ассоциаций или просто получите доступ к ассоциации ролей самостоятельно.

В-третьих,Следуйте правилу «Не заставляй меня думать» (DMMT), называя свои методы.

Имея в виду следующие три вещи:

def assign_default_role
  self.roles << Role.find_by_name("User")
end
...