此问题与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代码示例以及迁移代码示例。感谢。
答案 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
请注意,如果您想针对Arg
和Descriptor
之间的关联存储额外信息,那么您需要使用has_many :through association
获得的联接模型。
答案 1 :(得分:0)
您实际上需要在这两个对象之间使用中间表。在数据库世界中,这称为“映射”表。在Ruby中,您希望使用has_many通过关联。
http://railscasts.com/episodes/47-two-many-to-many
更新了更好的解释概念的文章。