添加关联时续集访问many_to_many连接表
我正在使用Sequel建立一个心愿单系统。 我有一个wishlists
和items
表以及一个items_wishlists
连接表(该名称是续集选择的名称)。 items_wishlists
表还有一个额外的列id用于facebook id(所以我可以存储opengraph动作),这是一个NOT NULL列。
我也有Wishlist
和Item
模型与续集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推荐))