【问题标题】:Ruby on Rails - has one and belongs to many relationshipRuby on Rails - 有一个和属于多个关系
【发布时间】:2010-07-27 01:44:52
【问题描述】:

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

我正在尝试为文档/数据管理系统构建一个网络应用程序,我有两个模型 - 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 代码示例。谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    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 获得的连接模型。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多