Ruby on Rails - 有一个属于很多关系

时间:2010-07-27 01:44:53

标签: ruby-on-rails activerecord migration has-many belongs-to

此问题与ruby on rails ActiveRecord关联以及如何生成这些迁移有关。

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

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

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

当我尝试以上所有内容时,出于某种原因,我无法获得两个Args来共享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

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

我不太熟练使用rails,也不熟悉迁移/数据库。如果您正在解释一个概念,请尝试提供ActiveRecord代码示例以及迁移代码示例。感谢。

2 个答案:

答案 0 :(得分: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获得的联接模型。

答案 1 :(得分:0)

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

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

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