2010-07-27 117 views
1

这个问题与Ruby on Rails的ActiveRecord关联有关,以及如何生成这些迁移。Ruby on Rails - 有一个属于很多关系

我试图建立一个文档/数据管理系统的Web应用程序,我有两个模型 - 精氨酸和描述符。 (使描述符成为对象而不是属性的原因是多个参数共享相同的描述)。 Args和描述符之间的关系如下:一个Arg只有一个描述符。描述符有许多参数。

基本上,在代码中,我希望能够做到以下几点:

a1 = Arg.first 
a1.descriptor = Descriptor.first 
d1 = Descriptor.last 
d1.args << Arg.last 
d1.args << Arg.first 

目前,我有这个设置:

class Descriptor < ActiveRecord::Base 
    has_and_belongs_to_many :args 
end 

class Arg < ActiveRecord::Base 
    has_one :descriptor 
end 

我也跑这些迁移:

create_table :args do |t| 
    t.string :name 
    t.timestamps 
end 

create_table :descriptors do |t| 
    t.string :name 
    ... 
    t.timestamps 
end 

add_column :descriptors, :switch_id, :integer 

create_table :args_descriptors, :id => false do |t| 
    t.column :arg_id, :integer, :null => false 
    t.column :descriptor_id, :integer, :null => false 
end 

当我尝试上述所有,我不能得到两个参数共享一个描述符对象的原因。例如:

>> Arg.first.descriptor 
=> nil 
>> Arg.first.descriptor = Descriptor.last 
=> #<Descriptor id: 9, name: ".... 
>> Arg.last.descriptor 
=> nil 
>> Arg.last.descriptor = Descriptor.last 
=> #<Descriptor id: 9, name: ".... 
>> Arg.first.descriptor 
=> nil 

为什么第一个Arg的描述符为零?我错过了我的数据库中的一列吗?我没有正确指定关系吗?

我并不十分精通rails和迁移/数据库。如果您正在解释一个概念,请请尝试提供ActiveRecord代码示例以及迁移代码示例。谢谢。

回答

0

你实际上想要在这两个对象之间建立一个中间表。在数据库世界中,这被称为“映射”表。在Ruby中,你想通过关联使用has_many。

http://railscasts.com/episodes/47-two-many-to-many

更新更好的文章,解释的概念。

2

我相信这些都是你需要的协会和迁移:

class Descriptor < ActiveRecord::Base 
    has_many :args 
end 

class Arg < ActiveRecord::Base 
    belongs_to :descriptor 
end 

create_table :args do |t| 
    t.string :name 
    t.integer :descriptor_id 
    t.timestamps 
end 

create_table :descriptors do |t| 
    t.string :name 
    ... 
    t.timestamps 
end 

注意,如果要存储对ArgDescriptor之间的关联额外的信息,那么你就需要一个连接,你得到的模型使用has_many :through association