1

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

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

当我尝试以上所有方法时,由于某种原因,我无法让两个 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 代码示例以及 Migrations 代码示例。谢谢。

4

2 回答 2

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.

于 2010-07-27T08:30:15.840 回答
0

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

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

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

于 2010-07-27T02:04:31.003 回答