将通用记录(如芯片组)附加到模型(主板),而不为每个记录(主板)创建新记录?

时间:2014-10-25 08:47:35

标签: ruby-on-rails ruby activerecord rails-activerecord

我在Ruby on Rails中构建了一个PC构建应用程序。该应用程序旨在为客户提供构建自己的计算机的能力

我在布置基本数据结构时遇到了问题。这是我到目前为止基本拥有的:

rails g model manufacturer name:string
rails g model cpu_socket name:string
rails g model cpu_architecture name:string
rails g model cpu_microarchitecture name:string cpu_architecture:references manufacturer:references
rails g model cpu model:string cpu_microarchitecture:references
rails g model motherboard_chipset name:string manufacturer:references
rails g model memory_type name:string
rails g model memory_socket name:string memory_type:references

但现在事情变得复杂了。 我不知道如何为主板型号建模。

以下应该是伪输出:

---------[snip]---------
- #<Motherboard id: 158679, memory_max_size: 68719476736, nvidia_sli: 3, amd_crossfirex: 4>
  - #<Chipset id: 14, name: 'Intel X99'>
  - #<CpuSocket id: 4, type: 'LGA2011'>
  - #<MemorySocket position: 0, type: '288-pin DDR4 DIMM', max_size: 8589934592, frequency: 2133, ecc: false>
  - #<MemorySocket position: 1, type: '288-pin DDR4 DIMM', max_size: 8589934592, frequency: 2133, ecc: false>
  - #<MemorySocket position: 2, type: '288-pin DDR4 DIMM', max_size: 8589934592, frequency: 2133, ecc: false>
  - #<MemorySocket position: 3, type: '288-pin DDR4 DIMM', max_size: 8589934592, frequency: 2133, ecc: false>
  - #<SataPort position: 0, type: 'SATA 6G'>
  - #<SataPort position: 1, type: 'SATA 6G'>
  - #<SataPort position: 2, type: 'SATA 6G'>
  - #<SataPort position: 3, type: 'SATA 6G'>
  - #<SataPort position: 4, type: 'SATA 6G'>
  - #<SataPort position: 5, type: 'SATA 6G'>
  - #<SataPort position: 6, type: 'SATA 6G'>
  - #<SataPort position: 7, type: 'SATA 6G'>
  - #<PciSlot position: 0, type: 'PCI-E 3.x', speed: 16>
  - #<PciSlot position: 1, type: 'PCI-E 3.x', speed: 16>
  - #<PciSlot position: 2, type: 'PCI-E 3.x', speed: 16>
  - #<PciSlot position: 3, type: 'PCI-E 3.x', speed: 16>
  - #<PciSlot position: 4, type: 'PCI-E 3.x', speed: 4>
...
---------[snip]---------

如何将这些附加到Motherboard?我相信可以安全地假设只有一个芯片组(因此chipset:references),但CpuSocket s,MemorySocket s,SataPortPciSlot S'我是不是太害怕了,甚至小孩都能回答这个问题?

我已经在Rails中创建了一些应用程序(&lt; 10),但这个级别的ActiveRecordry对我来说还是一个新的。

当然,我可以使用:json或:hash,但我相信有一种方法可以更多地使用ActiveRecord-ish方式......

1 个答案:

答案 0 :(得分:0)

到目前为止,您与模特之间存在一对多的关系。使用主板,您可以有多对多的关系。

给出两个表

| *motherboard* |  | * sataport * |
| Intel         |  | SATA 6G      |
| AMD           |  | SATA 3G      |

如果英特尔可以拥有Sata 6G和3G而且AMD也可以拥有SATA 6G和3G,则必须创建一个名为 motherboard_sataport 的第三个表

| motherboard_id | sataport_id |
| 1              | 2           |
| 1              | 1           |

这些名为JoinTables,rails可以为您生成一个。首先创建主板表,然后是sataport表。然后使用

创建迁移
rails g migration CreateJoinTableMotherboardSataport motherboard sataport

有关rails迁移的更多信息here,还会在rails here

中查看不同类型的关联