【问题标题】:Creating proper model associations创建适当的模型关联
【发布时间】:2019-10-28 17:05:27
【问题描述】:

使用 ruby​​ sequel gem,我有一个具有以下架构的小型 (sqlite3) 数据库:

db.create_table :item_types do
  primary_key :id
  String :name, unique: true, null: false
end

db.create_table :item_values do
  primary_key :id
  String :name, unique: true, null: false
end

db.create_table :items do
  primary_key :id
  foreign_key :type, :item_types, key: :id
  foreign_key :value, :item_values, key: :id
  String :name, unique: true, null: false
  String :desc, null: false
end

理想情况下,我希望能够使用类似于

item = Item.first(...)
puts item.type.name, item.value.name

阅读association 指南,看来我需要在Item 模型中为item_typesitem_values 建立一个one_to_one 关联。但是,我不确定链接它们的正确方法。外键应该通过key选项传递,还是有更合适的方法?

【问题讨论】:

    标签: ruby model sequel


    【解决方案1】:

    本指南通过此示例说明了如何设置一对多关联:

    # Database schema:
    #  artists            albums
    #   :id   <----\       :id
    #   :name       \----- :artist_id 
    #                      :name
    
    class Artist < Sequel::Model
      one_to_many :albums
    end
    
    class Album < Sequel::Model
      many_to_one :artist
    end
    

    说实话,我从未使用过 Sequel,但从指南看来,您应该这样做:

    class ItemType < Sequel::Model
      one_to_many :items
    end
    
    class ItemValue < Sequel::Model
      one_to_many :items
    end
    
    class Item < Sequel::Model
      many_to_one :type, class: 'ItemType', key: 'item_type_id'
      many_to_one :value, class: 'ItemValue', key: 'item_value_id'
    end
    

    恭喜。您刚刚将 EAV anti-pattern 移植到 Sequel。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2023-03-11
      • 2021-04-06
      • 2019-12-12
      • 1970-01-01
      相关资源
      最近更新 更多