我正在使用Sequel构建心愿单系统。我有一个wishlists
和items
表以及一个items_wishlists
联接表(该名称是续集选择的名称)。 items_wishlists
表还有一个额外的facebook id列(所以我可以存储opengraph动作),这是一个NOT NULL列。
我还有Wishlist
和Item
个模型,其中设置了续集many_to_many关联。 Wishlist
类还将many_to_many关联的:select
选项设置为select: [:items.*, :items_wishlists__facebook_action_id]
。
有没有办法在创建关联时添加额外的数据,比如wishlist.add_item my_item, facebook_action_id: 'xxxx'
或其他什么?创建关联后我无法执行此操作,因为facebook id在列上没有NULL。
感谢您的帮助
答案 0 :(得分:7)
建议的方法是为连接表添加模型。但是,如果您不想这样做,可以执行以下操作:
class Wishlist
def _add_item(item, hash={})
model.db[:items_wishlists].insert(hash.merge(:item_id=>item.id, :wishlist_id=>id))
end
end
答案 1 :(得分:1)
我认为还有另一种可能性。
首先是您问题的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推荐))