加入时更新列 table
update column on join table
我有两个 sequel 模型 user
和 event
,目前由单个连接处理 table。
可以邀请用户参加活动,并且这些邀请附有状态;这是由另一个连接处理的 table.
class Event < Sequel::Model(:events)
many_to_many :users
many_to_many :invitations, :join_table => :events_invitations, :right_key => :user_id, :class => :User, :select=>[Sequel.expr(:users).*, :events_invitations__status]
end
class User < Sequel::Model(:users)
many_to_many :events
many_to_many :invitations, :join_table => :events_invitations, :right_key => :event_id, :class => :Event, :select=>[Sequel.expr(:events).*, :events_invitations__status]
end
我能够创建和访问关联的邀请,但更改永远不会保存(我假设是由于我设置 many_to_many 的方式)
user = User.create(name: "bob")
event = Event.create(title: "super fete")
user.add_event(e)
event.add_invitation(e)
invite = user.invitations.first
# this returns a reference to the event, with the extra status column from the join table
# <Event @values={:id=>1, :title=>"fete", :owner_id=>nil, :user_id=>nil, :status=>"pending"}>
# does not actually save back to the table if I modify it...
invite[:status] = "accepted"
我应该如何建模才能查看和设置用户和活动邀请的状态?
首先,一些(最终无用的)基础知识。
Sequel 允许您将模型视为散列,只要您可以在其上存储额外的只读值。但是,与从数据集返回的 Sequel 的哈希值一样,仅设置密钥不会更新它。例如:
bob = DB[:users][name:'Bob'] #=> {:id=>1, :name=>"Bob"}
bob[:name] = 'Mary'
p bob #=> {:id=>1, :name=>"Mary"}
p DB[:users][1] #=> {:id=>1, :name=>"Bob"}
模型实例也是如此:
bob = User[name:'Bob'] #=> #<User @values={:id=>1, :name=>"Bob"}>
bob[:name] = 'Mary'
p bob #=> #<User @values={:id=>1, :name=>"Mary"}>
p User[1] #=> #<User @values={:id=>1, :name=>"Bob"}>
bob.name = 'Jerome'
p bob #=> #<User @values={:id=>1, :name=>"Jerome"}>
p User[1] #=> #<User @values={:id=>1, :name=>"Bob"}>
对于数据集,您需要update
您的数据集才能更改数据库中的值。
对于模型,您需要更新上述值,然后 save
your changes to that model instance (e.g. bob.save
) or you need to use your instances to update
使用新值(例如 bob.update name:'Mary'
)。
但实际上,您在滥用 many_to_many
class
和 select
值来制作看起来像 Event
的东西,但实际上却不是。如果有 20 人被邀请参加宴会,那么让 20 个不同的 "events" 都被命名为 "super fete" 但身份不同是不正确的。那些不是活动,那些是邀请。
您想要一个 Invitation
模型来表示您的连接,并与连接 table 相关联。然后你可以得到一个实例,它有一个 status
,你可以 update
随心所欲。您不能从 Event
实例中 update
因为它对 events_invitations
table 或 status
列一无所知,除了获取它们当被问到时。
我有两个 sequel 模型 user
和 event
,目前由单个连接处理 table。
可以邀请用户参加活动,并且这些邀请附有状态;这是由另一个连接处理的 table.
class Event < Sequel::Model(:events)
many_to_many :users
many_to_many :invitations, :join_table => :events_invitations, :right_key => :user_id, :class => :User, :select=>[Sequel.expr(:users).*, :events_invitations__status]
end
class User < Sequel::Model(:users)
many_to_many :events
many_to_many :invitations, :join_table => :events_invitations, :right_key => :event_id, :class => :Event, :select=>[Sequel.expr(:events).*, :events_invitations__status]
end
我能够创建和访问关联的邀请,但更改永远不会保存(我假设是由于我设置 many_to_many 的方式)
user = User.create(name: "bob")
event = Event.create(title: "super fete")
user.add_event(e)
event.add_invitation(e)
invite = user.invitations.first
# this returns a reference to the event, with the extra status column from the join table
# <Event @values={:id=>1, :title=>"fete", :owner_id=>nil, :user_id=>nil, :status=>"pending"}>
# does not actually save back to the table if I modify it...
invite[:status] = "accepted"
我应该如何建模才能查看和设置用户和活动邀请的状态?
首先,一些(最终无用的)基础知识。
Sequel 允许您将模型视为散列,只要您可以在其上存储额外的只读值。但是,与从数据集返回的 Sequel 的哈希值一样,仅设置密钥不会更新它。例如:
bob = DB[:users][name:'Bob'] #=> {:id=>1, :name=>"Bob"}
bob[:name] = 'Mary'
p bob #=> {:id=>1, :name=>"Mary"}
p DB[:users][1] #=> {:id=>1, :name=>"Bob"}
模型实例也是如此:
bob = User[name:'Bob'] #=> #<User @values={:id=>1, :name=>"Bob"}>
bob[:name] = 'Mary'
p bob #=> #<User @values={:id=>1, :name=>"Mary"}>
p User[1] #=> #<User @values={:id=>1, :name=>"Bob"}>
bob.name = 'Jerome'
p bob #=> #<User @values={:id=>1, :name=>"Jerome"}>
p User[1] #=> #<User @values={:id=>1, :name=>"Bob"}>
对于数据集,您需要update
您的数据集才能更改数据库中的值。
对于模型,您需要更新上述值,然后 save
your changes to that model instance (e.g. bob.save
) or you need to use your instances to update
使用新值(例如 bob.update name:'Mary'
)。
但实际上,您在滥用 many_to_many
class
和 select
值来制作看起来像 Event
的东西,但实际上却不是。如果有 20 人被邀请参加宴会,那么让 20 个不同的 "events" 都被命名为 "super fete" 但身份不同是不正确的。那些不是活动,那些是邀请。
您想要一个 Invitation
模型来表示您的连接,并与连接 table 相关联。然后你可以得到一个实例,它有一个 status
,你可以 update
随心所欲。您不能从 Event
实例中 update
因为它对 events_invitations
table 或 status
列一无所知,除了获取它们当被问到时。