【问题标题】:update column on join table更新连接表上的列
【发布时间】:2015-02-03 00:40:53
【问题描述】:

我有两个续集模型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"

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

【问题讨论】:

标签: mysql ruby sequel


【解决方案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 人参加 fête,那么有 20 个不同的“事件”都名为“super fête”但状态不同是不正确的。那些不是活动,那些是邀请。

您想要一个Invitation 模型来表示您的连接,与连接表相关联。然后你可以得到一个有status的实例,你可以随意update它。您不能从Event 实例中update,因为它不知道events_invitations 表或status 列的任何信息,除了在被询问时获取它们。

【讨论】:

  • 这完全有道理;拥有连接表的模型感觉更自然。我仍在苦苦思考如何根据 Sequel 关联准确地表达该模型中的关系。如果这在更新问题时无法涵盖,我可以再问一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2013-08-08
  • 1970-01-01
  • 2012-04-05
  • 2011-05-05
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多