0

我是 Ruby on Rails 的新手,但遇到了这个有趣的情况:

我有三个模型

  1. 用户
  2. 公司
  3. 项目

我想通过以下方式关联它们:

  1. 公司有_many用户
  2. 用户所属公司

    通过USERS表中的company_id列实现

    User.CompanyCompany.Users工作正常。


  1. 项目has_and_belongs_to_many用户
  2. 用户has_and_belongs_to_many项目

    通过使用projetcs_users表中的has_and_belongs_to_many关系实现

    Project.UsersUser.Projects工作正常。


当我希望他们也按以下方式加入时,真正的问题来了:

  1. 公司属于所有者 (:通过 => 用户)
  2. 所有者has_one公司

    ---一个公司可以有多个所有者,但一个用户只能拥有一个公司。他不能同时拥有多家公司。

    ---用户可能是也可能不是公司的所有者,但始终属于某个公司。---一个用户不能同时属于两家公司。

  3. 项目has_one Project_manager (:through => User)

  4. Project_manager属于_to项目

    ---一个项目只能有一个Project_manager,但一个可以是多个项目的项目经理。

我无法弄清楚应该如何在Models中定义关系。另外三个模型的结构应该是什么。

我的目标是实现:

  1. 公司.所有者

    可以通过以下方式完成:

    @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 回答