Mysql 更新联接表上的列

Mysql 更新联接表上的列,mysql,ruby,sequel,Mysql,Ruby,Sequel,我有两个sequel模型user和event,目前由一个联接表处理。 可以邀请用户参加活动,并且这些邀请具有附加的状态;这由另一个联接表处理 class Event < Sequel::Model(:events) many_to_many :users many_to_many :invitations, :join_table => :events_invitations, :right_key => :user_id, :class => :User, :s

我有两个sequel模型user和event,目前由一个联接表处理。 可以邀请用户参加活动,并且这些邀请具有附加的状态;这由另一个联接表处理

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
我可以创建和访问相关的邀请,但由于我设置了多对多的方式,我假设更改从未保存

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"}>
对于数据集,您需要修改数据集以更改数据库中的值

对于该模型,您需要更新上述值,然后对该模型实例进行更改,例如bob.save,或者您需要将实例与新值一起使用,例如bob.update name:'Mary'

但实际上,您正在滥用many_to_many类并选择值来创建一个看起来像事件的东西,但事实并非如此。如果有20个人被邀请参加这次盛会,那么有20个不同的活动都被称为超级盛会,但地位不同是不正确的。那些不是活动,那些是邀请


您需要一个邀请模型来表示与联接表关联的联接。然后,您可以获得一个具有状态的实例,并可以根据需要对其进行更新。您无法从事件实例进行更新,因为它不知道有关事件邀请表或状态列的任何信息,只知道在被询问时获取它们。

请参阅相关:我在另一个问题中给出了一个答案,您可以看到,如何调整多对多关系,以便在添加邀请中添加其他参数。但要获得数据,你需要一个模型,这是完全有道理的;拥有联接表的模型感觉更自然。我仍然在为如何准确地用续集关联来表达模型中的关系而挣扎。如果这太多了,我可以问另一个问题。