Я пытаюсь протестировать систему друзей в стиле Facebook. У меня есть простая модель User и модель UserRelationship, которая берет два внешних ключа из таблицы пользователей, которые я назвал inviter_id и invited_id:

class User < ApplicationRecord
  has_many :user_relationships
  has_many :friends, through: :user_relationships, source: :invited
end

class UserRelationship < ApplicationRecord
  belongs_to :inviter, class_name: "User"
  belongs_to :invited, class_name: "User"
end

Я пробовал варианты этого и не могу понять, где я ошибаюсь. Я хочу иметь возможность позвонить User.first.friends и получить полный список друзей. в настоящее время я получаю ошибку:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column user_relationships.user_id does not exist

Столы:

create_table "user_relationships", force: :cascade do |t|
  t.integer  "inviter_id"
  t.integer  "invited_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "users", force: :cascade do |t|
  t.string   "name"
  t.string   "email"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

Благодарность

ОБНОВЛЕНИЕ

Используя то, что сказал Абхилаш об ассоциации has_many :user_relationships, я изменил ее на следующее:

class User < ApplicationRecord
  has_many :user_relationships, foreign_key: "invited_id"
  has_many :friends, through: :user_relationships, source: :invited
end

Проблема в том, что это возвращает только приглашенных, а не приглашающих. Я чувствую, что должен быть способ использовать как базу данных, так и ассоциации?

0
Danny Santos 13 Апр 2018 в 12:37

1 ответ

Лучший ответ

Вам необходимо удалить приведенную ниже строку из модели User.

has_many :user_relationships

Потому что в модели UserRelationship у вас есть поля для inviter_id и invited_id, но не для user_id.

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

def user_relationships
    UserRelationship.where("invited_id = ? OR inviter_id = ?", self.id, self.id)
end

Отредактировано:

У вас также могут быть ассоциации, подобные приведенным ниже:

class User < ActiveRecord::Base
  has_many :inviter_user_relationships, :class_name => 'UserRelationship', :foreign_key => 'inviter_id'
  has_many :invited_user_relationships, :class_name => 'UserRelationship', :foreign_key => 'invited_id'

  def user_relationships
    inviter_user_relationships + invited_user_relationships
  end

end
1
Abhilash Reddy 13 Апр 2018 в 10:54