0

私はRuby on Railsの初心者ですが、この興味深い状況で立ち往生しています:

私は3つのモデルを持っています:

  1. ユーザー
  2. 会社
  3. 計画

私は次の方法でそれらを関連付けたい:

  1. 会社には_多くのユーザーがいます
  2. ユーザーの所属会社

    USERSテーブルのcompany_id列を介して実装

    User.CompanyまたはCompany.Users正常に動作します。


  1. プロジェクトhas_and_belongs_to_manyユーザー
  2. ユーザーhas_and_belongs_to_manyプロジェクト

    projetcs_usersテーブルで使用するhas_and_belongs_to_manyリレーションを介して実装

    Project.UsersまたはUser.Projects正常に動作します。


本当の問題は、次のように参加してもらいたいときに発生します。

  1. 会社の所有 (:スルー => ユーザー)
  2. 所有者has_one会社

    ---会社は複数の所有者を持つことができますが、1 人のユーザーが所有できる会社は1 つだけです。彼は複数の会社の所有者になることはできません。

    ---ユーザーは会社の所有者である場合とそうでない場合がありますが、常に何らかの会社に属しています。---ユーザーが 2 つの会社に所属することはできません。

  3. プロジェクトhas_one Project_manager (:through => ユーザー)

  4. Project_manager belongs_toプロジェクト

    ---プロジェクトはProject_managerを 1つだけ持つことができますが、1 つは複数のプロジェクトのプロジェクト マネージャーになることができます。

Modelsで関係を定義する方法がわかりません。また、3 つのモデルすべてのテーブル構造はどうあるべきか。

私の目的は達成することです:

  1. Company.所有者

    次の方法で実行できます。

    @owner = User.find(Company.owner_id)

  2. Project.Project_manager

    次の方法で実行できます。

    @Project_manager = User.find(Project.project_manager_id)

しかし、そのように機能させたくありません!!

残りは私にとって完全にうまく機能しています。

4

2 に答える 2

1

これは、正しい軌道に乗るのに役立ちます。

class User
  # the owner relation
  #
  # user.owned_company 
  # => company
  #
  has_one :owned_company, :class_name => "Company", :foreign_key => "owner_id"

  # the project manager relation
  #
  # user.managed_projects 
  # => [project,...]
  #
  has_many :managed_projects, :class_name => "Project", :foreign_key => "project_manager_id"
end

class Company
  # the owner relation
  #
  # company.owner
  # => user
  #
  belongs_to :owner, :class_name => "User"
end

class Project
  # the project manager relation
  #
  # company.project_manager 
  # => user
  #
  belongs_to :project_manager, :class_name => "User"
end

Rails ActiveRecord のリレーションは非常によく文書化されています。ドキュメントを参照してください http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

于 2012-09-21T18:53:27.167 に答える
0

これが私が達成できる最終的な出力です:


-----モデル-----

プロジェクト

class Project < ActiveRecord::Base
  attr_accessible  :name

  has_and_belongs_to_many :users
  belongs_to :project_manager, :class_name => "User"

end

ユーザー

class User < ActiveRecord::Base
  attr_accessible :name, :project_id

  belongs_to :company
  belongs_to :owned_company, :class_name => "Company", :foreign_key => "owner_id"
  has_many :managed_projects, :class_name => "Project", :foreign_key => "project_manager_id"
  has_and_belongs_to_many :projects

end

会社

class Company < ActiveRecord::Base
  attr_accessible :name

  has_many :users
  has_many :owners, :class_name => "User", :foreign_key => "owner_id"  

end

-----テーブルと移行-----

プロジェクト

class CreateProjects < ActiveRecord::Migration
  def change
    create_table :projects do |t|
      t.string :name
      t.integer :project_manager_id

      t.timestamps
    end
  end
end

ユーザー

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.integer :project_id
      t.integer :owner_id

      t.timestamps
    end
  end
end

会社

class CreateCompanies < ActiveRecord::Migration
  def change
    create_table :companies do |t|
      t.string :name

      t.timestamps
    end
  end
end

プロジェクト - ユーザー - テーブルに参加

class CreateTableProjectsUsers < ActiveRecord::Migration
  def self.up
    create_table :projects_users,:id => false  do |t|
      t.integer :project_id
      t.integer :user_id
    end
  end

  def self.down
     drop_table :projects_users
  end
end
于 2012-09-21T20:31:17.397 に答える