5

我正在使用 Sequel 构建愿望清单系统。我有一个wishlistsitems表和一个items_wishlists连接表(该名称是续集选择的名称)。该items_wishlists表还有一个用于 facebook id 的额外列(因此我可以存储 opengraph 操作),它是一个 NOT NULL 列。

我还设置了带有续集 many_to_many 关联的模型WishlistItem该类Wishlist还具有:select将 many_to_many 关联设置为 的选项select: [:items.*, :items_wishlists__facebook_action_id]

有没有一种方法可以在创建关联时添加额外的数据,比如wishlist.add_item my_item, facebook_action_id: 'xxxx'什么?在我创建关联后我不能这样做,因为 facebook id 在列上没有 NULL。

谢谢你的帮助

4

2 回答 2

7

推荐的方法是为连接表添加一个模型。但是,如果你不想这样做,你可以这样做:

class Wishlist
  def _add_item(item, hash={})
    model.db[:items_wishlists].insert(hash.merge(:item_id=>item.id, :wishlist_id=>id))
  end
end
于 2013-03-28T14:48:52.670 回答
2

我认为还有另一种可能。

首先是您问题的 MWE(最小工作示例):

  require 'sequel'
  Sequel.extension :pretty_table  #Sequel::PrettyTable.print()/Sequel::PrettyTable.string()

  DB = Sequel.sqlite
  DB.create_table(:wishlists){
        primary_key :id
        String :listname
  }
  DB.create_table(:items){
        primary_key :id
        String :descr
    }
  DB.create_table(:items_wishlists){
        primary_key :id
        foreign_key :wishlist_id, :wishlists
        foreign_key :item_id, :items

        add_column :facebook_id, type: :nvarchar
  }

  class Item < Sequel::Model
    many_to_many :wishlists 
  end

  class Wishlist < Sequel::Model
    many_to_many :items
  end

  w1 = Wishlist.create(listname: 'list1')
  w1.add_item(Item.create(descr: 'item 1'))
  #w1.add_item(Item.create(descr: 'item 2'), facebook_id: 'fb2')  ##<- This does not work

  #Sequel::PrettyTable.print(Wishlist)
  #Sequel::PrettyTable.print(Item)
  Sequel::PrettyTable.print(DB[:items_wishlists])

要允许ad_item使用参数 ( Wishlist#add_item(Item.create(descr: 'item 2'), facebook_id: 'fb2')),您必须定义一个adder,如下例所示:

require 'sequel'
Sequel.extension :pretty_table  
Sequel::PrettyTable.print()/Sequel::PrettyTable.string()

DB = Sequel.sqlite
DB.create_table(:wishlists){
      primary_key :id
      String :listname
}
DB.create_table(:items){
      primary_key :id
      String :descr
  }
DB.create_table(:items_wishlists){
      primary_key :id
      foreign_key :wishlist_id, :wishlists
      foreign_key :item_id, :items

      add_column :facebook_id, type: :nvarchar
}

class Item < Sequel::Model
  #~ many_to_many :wishlists 
end

class Wishlist < Sequel::Model
  many_to_many :items, 
                join_table: :items_wishlists, class: Item,
                left_key: :wishlist_id, right_key: :item_id, 
                adder: (lambda do |item, facebook_id: nil|
                      self.db[:items_wishlists].insert(wishlist_id: self.id, item_id: item.id, facebook_id: facebook_id)
                end)
end

w1 = Wishlist.create(listname: 'list1')
w1.add_item(Item.create(descr: 'item 1'))
w1.add_item(Item.create(descr: 'item 2'), facebook_id: 'fb2')

Sequel::PrettyTable.print(DB[:items_wishlists])

结果:

+-----------+--+-------+-----------+
|facebook_id|id|item_id|wishlist_id|
+-----------+--+-------+-----------+
|           | 1|      1|          1|
|fb2        | 2|      2|          1|
+-----------+--+-------+-----------+

但下一个问题将在稍后出现:

随着w1.items您获得项目列表,但您无权访问参数。(至少到目前为止我没有发现任何方法。我仍在研究,但我希望我需要一个连接表的模型(参见 Jeremys 的建议))

于 2018-01-07T16:27:36.273 回答