TodoList: ユーザの所属先2006年12月07日 13時34分10秒

さて、次にユーザを所属によって分けてみたいと思う。group だと Todo を分けるのか、ユーザを分けるのかが混乱しやすくなりそうなので、organization を使う。

Associations に関連する複数のテーブルについて書いてある。

  • has_one
  • has_many
  • belongs_to
  • has_and_belongs_to_many
の種類があるそうだ。

各ユーザは一つの組織にしか所属できないこととする。つまり、多:1 の関係になる。an organization has many users; a user belogns to an organization だ。

organizations のテーブルを作り、その後 user_engine が作った、users テーブルに organization_id を追加する必要がある。


% cat support_organization.mysql
USE todos;
CREATE TABLE `organizations`
(
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(100) NOT NULL,
  `description` VARCHAR(100),
  PRIMARY KEY(`id`)
);
ALTER TABLE users ADD organization_id INT;
% cat support_organization.mysql | mysql

今の時点では、support_organization.mysql として保存する。後で、別の SQL コマンドと一緒にする予定だ。

モデルとコントローラを生成し、コントローラに scaffold :organization を追加する。


% ruby script/generate model Organization
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/organization.rb
      create  test/unit/organization_test.rb
      create  test/fixtures/organizations.yml
      exists  db/migrate
      create  db/migrate/002_create_organizations.rb
% ruby script/generate controller organization
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/organization
      exists  test/functional/
      create  app/controllers/organization_controller.rb
      create  test/functional/organization_controller_test.rb
      create  app/helpers/organization_helper.rb
% vi app/controllers/organization_controller.rb
class OrganizationController <
ApplicationController
  scaffold :organization
end

これで、http://localhost:3000/organization/list でき、新しい組織も作ることが出来るようになった。

この後、組織と各ユーザを関連付ける。


% cp vendor/plugins/user_engine/app/models/user.rb app/models/
% vi app/models/users.rb
class User < ActiveRecord::Base
  belongs_to :organization
  include LoginEngine::AuthenticatedUser
  include UserEngine::AuthorizedUser

  # Returns the full name of this user.
  def fullname
    "#{self.firstname} #{self.lastname}"
  end
end
% vi app/models/organization.rb
class Organization < ActiveRecord::Base
  has_many :users
end

これで、各ユーザはある組織に所属することが出来るようになった。organization_id が NULL の場合は、無所属という事になる。

前回次回