обновить столбец в таблице соединений

У меня есть две модели продолжения 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

Я могу создавать и получать доступ к связанным приглашениям, но изменения никогда не сохраняются (я предполагаю, что это связано с тем, как я настроил 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"

Как мне смоделировать это, чтобы иметь возможность видеть и устанавливать статус приглашений для пользователей и событий?


person Nick Tomlin    schedule 03.02.2015    source источник
comment
См. также: stackoverflow.com/questions/15672918/   -  person Phrogz    schedule 05.02.2015
comment
Я сделал в другом вопросе ответ stackoverflow.com/a/48139189/676874, где вы можете увидеть, как вы можете адаптировать many_to_many-relation, чтобы добавить дополнительные параметры в ваш add_invittion. Но для получения данных нужна модель.   -  person knut    schedule 07.01.2018


Ответы (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 class и select, чтобы сделать вещь, которая выглядит как Event, но не является таковой. Если на праздник приглашено 20 человек, неправильно иметь 20 разных «событий», названных «суперпраздником», но с разным статусом. Это не мероприятия, это приглашения.

Вы хотите, чтобы модель Invitation представляла ваше соединение, связанное с таблицей соединений. Затем вы можете получить экземпляр, который имеет status, и вы можете update его по своему усмотрению. Вы не можете update из экземпляра Event, потому что он ничего не знает о таблице events_invitations или столбце status, кроме как получить их по запросу.

person Phrogz    schedule 04.02.2015
comment
Это имеет смысл; наличие модели для таблицы соединений кажется более естественным. Я все еще борюсь с тем, как именно выразить отношения в этой модели с точки зрения ассоциаций сиквелов. Если это слишком много, чтобы рассказать об обновлении вопроса, я могу задать другой. - person Nick Tomlin; 05.02.2015