添加关联时续集访问many_to_many连接表

我正在使用Sequel建立一个心愿单系统。 我有一个wishlistsitems表以及一个items_wishlists连接表(该名称是续集选择的名称)。 items_wishlists表还有一个额外的列id用于facebook id(所以我可以存储opengraph动作),这是一个NOT NULL列。

我也有WishlistItem模型与续集many_to_many关联设置。 Wishlist类还具有:select many_to_many关联集的:select选项,用于select: [:items.*, :items_wishlists__facebook_action_id]

有没有一种方法可以在创建关联时添加额外的数据,比如wishlist.add_item my_item, facebook_action_id: 'xxxx'或者什么? 我创建关联后无法执行此操作,因为facebook id在列上具有NOT NULL。

谢谢你的帮助

建议的方法是为连接表添加模型。 但是,如果您不想这样做,您可以:

 class Wishlist def _add_item(item, hash={}) model.db[:items_wishlists].insert(hash.merge(:item_id=>item.id, :wishlist_id=>id)) end end 

我认为还有另一种可能性。

首先是您的问题的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推荐))