Ruby on rails RubyonRails——只有一个,属于多个关系

Ruby on rails RubyonRails——只有一个,属于多个关系,ruby-on-rails,activerecord,migration,has-many,belongs-to,Ruby On Rails,Activerecord,Migration,Has Many,Belongs To,这个问题与RubyonRailsActiveRecord关联以及如何生成这些迁移有关 我正在尝试为文档/数据管理系统构建一个web应用程序,我有两个模型-Arg和Descriptor。(使描述符成为对象而不是属性的原因是多个参数共享相同的描述)。Arg和描述符之间的关系如下:Arg只有一个描述符。描述符有许多参数 基本上,在代码中,我希望能够执行以下操作: a1 = Arg.first a1.descriptor = Descriptor.first d1 = Descriptor.last d

这个问题与RubyonRailsActiveRecord关联以及如何生成这些迁移有关

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

基本上,在代码中,我希望能够执行以下操作:

a1 = Arg.first
a1.descriptor = Descriptor.first
d1 = Descriptor.last
d1.args << Arg.last
d1.args << Arg.first
当我尝试以上所有方法时,由于某种原因,我无法让两个参数共享一个描述符对象。例如:

>> 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.first.descriptor
=>零
>>Arg.first.descriptor=descriptor.last
=>#>Arg.first.descriptor
=>零
为什么第一个参数的描述符现在为零??我的数据库中是否缺少一列?我是否没有正确指定关系


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

实际上,您需要在这两个对象之间建立一个中间表。在数据库世界中,这称为“映射”表。在Ruby中,您希望通过关联使用has\u many


更新了更好的文章来解释概念。

我相信这些是您需要的关联和迁移:

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 
类描述符 请注意,如果要根据
Arg
Descriptor
之间的关联存储额外信息,则需要使用

>> 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
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