Использование модели для ассоциации не приводит к ошибке PK

В моем приложении есть концепция пользователей, событий и приглашений. Пользователь может быть приглашен на множество событий, а на событие может быть приглашено много пользователей; к этой связи привязан статус, который указывает, принял ли пользователь приглашение или нет.

Я моделирую приглашение, используя модель приглашения для таблицы соединения между событиями и пользователями, но я не могу фактически обновить таблицу соединения с помощью назначенной ей модели приглашения:

class Event < Sequel::Model
  many_to_many :users, :join_table => :invitations
  one_to_many :invitations
end

class Invitation < Sequel::Model
  many_to_one :user
  many_to_one :event
end

class User < Sequel::Model
  many_to_many :events, :join_table => :invitations
  one_to_many :invitations

  def invite (user, event)
    user.add_invitation(event: event)
  end

  def decline(event)
    i = Invitation.where(user: self, event: event).first
    i.update(status: "declined")
  end
end

user_one = User.create(name: "foo")
user_two = User.create(name: "bar")
event = Event.create(title: "fete")

user_one.add_event(event)
user_one.invite(user_two, event)

user_two.invitations
# [#<Invitation @values={:id=>nil, :status=>"pending", :event_id=>1, :user_id=>2}>]
# id is nil, which probably leads to the error below?

user_two.decline(event)
# `pk': No primary key is associated with this model (Sequel::Error)`

Изменить: мой код создания таблицы:

DB.create_table :users do
  primary_key :id
  string :name

  foreign_key :event_id
end

DB.create_table :events do
  primary_key :id
  string :title

  foreign_key :owner_id
  foreign_key :user_id
end

DB.create_table :invitations do
  primay_key :id
  string :status, :default => "pending"
  foreign_key :event_id, :events
  foreign_key :user_id, :users
end

person Nick Tomlin    schedule 06.02.2015    source источник
comment
Я запустил этот точный код без проблем, я думаю, что что-то не так с тем, как вы создаете таблицы. Можете выложить код или схему?   -  person Jesper    schedule 06.02.2015
comment
@Jesper интересно. Я обновил сообщение с кодом создания таблицы. Спасибо!   -  person Nick Tomlin    schedule 06.02.2015


Ответы (2)


У вас опечатка в коде создания таблицы:

DB.create_table :invitations do
  primay_key :id # <= should be primary_key

Я получаю ту же ошибку, что и вы, когда я добавляю эту опечатку в свой код.

person Jesper    schedule 06.02.2015

Я никогда не использовал продолжение, но кажется, что оно не знает, что является первичным ключом для модели пользователя или для события.

Вы пытались точно сказать, какие столбцы использовать? Например:

Invitation.where(user_id: self.id, event_id: event.id)
person Ismael    schedule 06.02.2015
comment
изменение параметров запроса не помогает к сожалению. - person Nick Tomlin; 06.02.2015