gpt4 book ai didi

mysql - 更新连接表上的列

转载 作者:行者123 更新时间:2023-11-29 00:04:13 24 4
gpt4 key购买 nike

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

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

最佳答案

首先,一些(最终无用的)基础知识。

Sequel 允许您将模型视为散列,因为您可以在其上存储额外的只读值。但是,与从数据集返回的 Sequel 哈希一样,仅设置 key 不会更新它。例如:

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 个不同的“事件”都命名为“ super 宴会”但状态不同是不正确的。这些不是事件,而是邀请。

你想要一个 Invitation模型来表示您的连接,与连接表相关联。然后你可以获得一个具有 status 的实例, 你可以 update随心所欲。你不能 update来自 Event实例,因为它对 events_invitations 一无所知表或 status列,而不是在被询问时获取它们。

关于mysql - 更新连接表上的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com