连接表上的更新列

时间:2015-02-03 00:40:53

标签: mysql ruby sequel

我有两个续集模型userevent,目前由一个连接表处理。 可以邀请用户参加活动,这些邀请会附加状态;这是由另一个连接表处理的。

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"

我应该如何对其进行建模,以便能够查看和设置用户和事件邀请的状态?

1 个答案:

答案 0 :(得分:1)

首先,一些(最终没有帮助)的基础知识。

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您对该模型实例的更改(例如bob.save),或者您需要将实例用于update它带有新值(例如bob.update name:'Mary')。


但实际上,您滥用many_to_many classselect值来制作看似Event的内容,但事实并非如此。如果有20个人被邀请参加,那么将20个不同的“活动”全部命名为“超级宴会”但状态不同是不正确的。那些不是事件,而是邀请。

您希望Invitation模型表示与联接表关联的联接。然后,您可以获得具有status的实例,并且可以根据需要update。您不能update来自Event实例,因为它对events_invitations表或status列一无所知,只是在被问及时获取它们。< / p>