数据库结构 - 多用户系统中的关联

时间:2012-10-27 08:27:45

标签: ruby-on-rails ruby

我正在建立一个ROR的多客户系统。 (我在看http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

结构是客户有合同,因此当他用他的用户名,密码和合同登录时,他将有权访问该系统。

我们将合同ID作为“主密钥”,它必须位于系统的每个表中。

class CreateContracts < ActiveRecord::Migration
  def change
    create_table :contracts do |t|
      t.integer  :contract_id
    end
  end
end

(会计科目表)

class CreateCoas < ActiveRecord::Migration
  def change
    create_table :coas do |t|
      t.integer  :account_id
      t.string    :account_name
    end
  end
end


class CreateCustGroups < ActiveRecord::Migration
  def change
    create_table :custgroups do |t|
      t.integer  :account_id1
      t.integer  :account_id2
      t.integer  :account_id3
    end
  end
end

Q1:如何使用belongs_to定义合约?系统中的每个表都必须与合同表有关系。我必须与所有桌子有关系吗? (我想是的)

class Contracts < ActiveRecord::Base
  has_and_belongs_to_many :Coas
  has_many:xxx
  belongs:to
end

Q2:如何在custgroup上定义关联?这里我们有一个记录,其中有3个或更多字段链接到同一个表(COA)。

1 个答案:

答案 0 :(得分:1)

正如Jesper所说,很难理解你想要实现的目标,但我会尽力回答你的问题:

Q1:如果您希望所有表都引用合同,则需要向所有这些表添加一个foreign_key,例如contract_id 所以每个create_table调用都有contract_id键

create_table :new_models do |t|
  t.belongs_to  :contract # this will create a contract_id field
end

您还可以在列

上添加索引
add_index :new_models, :contract_id

然后在所有模型中,您将添加belongs_to关联:

class NewModel
  ...
  belongs_to :contract
  ...
end

所以,如果你的Coas&amp; CustGroups需要引用合同表,您必须更改两个迁移以包含contract_id密钥,然后更改模型以添加belongs_to关联

如果contract需要访问引用它的所有Coas,那么您需要使用has_many关联

class Contracts < ActiveRecord::Base
  ...
  has_many :coas
  ...
end

看起来你不需要has_and_belongs_to_many,但我可能错了。 如果合同还需要访问CustGroups,您将添加:

has_many :cust_groups模型中的

Contract

Q2:我真的不明白你想做什么。请解释Coas和Custgroups之间的关系,我会尽力帮助您