Как работает has_many: работает только с двумя моделями? - PullRequest
0 голосов
/ 11 июня 2019

Просто пытаюсь понять, как работает has_many :through, когда есть только две модели.Я знаю, что есть целая куча ответов, но ни один из них, кажется, не дает пример только с использованием двух моделей, все остальные примеры используют три + примерные модели.

Вопрос, на который я хотел бы ответить, заключается в том, почему, хотяв консоли rails я получаю два совершенно разных результата с помощью команд a.friendships против a.friends, например, почему a.friends знает, что мне вернуть объект пользователя?но a.friendships нет.

#User.rb
class User < ApplicationRecord         
  has_many :friendships
  has_many :friends, through: :friendships
end
#Friendship.rb
class Friendship < ApplicationRecord
    belongs_to :user
    belongs_to :friend, class_name: "User"

end
irb(main):020:0> a = User.first
irb(main):016:0> a.friendships
  Friendship Load (0.1ms)  SELECT  "friendships".* FROM "friendships" WHERE "friendships"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Friendship id: 1, user_id: 1, friend_id: 2, created_at: "2019-06-10 20:27:16", updated_at: "2019-06-10 20:31:41">]>
irb(main):020:0> a = User.first
irb(main):019:0> a.friends
  User Load (0.1ms)  SELECT  "users".* FROM "users" INNER JOIN "friendships" ON "users"."id" = "friendships"."friend_id" WHERE "friendships"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<User id: 2, email: "myemail@gmail.com", created_at: "2019-06-10 20:28:25", updated_at: "2019-06-10 20:28:25">]>

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

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

 class Employee < ApplicationRecord
  has_many :subordinates, class_name: "Employee",
                          foreign_key: "manager_id"

  belongs_to :manager, class_name: "Employee"
end

С помощью этой настройки вы можете получить @ employee.subordinates и @ employee.manager.

Источник: https://guides.rubyonrails.org/association_basics.html#self-joins

1 голос
/ 11 июня 2019
users table
-----------
-id
-...
friendships table
-----------------
- id
- user_id
- friend_id

Когда вы звоните @user.friendships, цель состоит в том, чтобы найти friendships из @user.он возвращает объекты из friendships таблицы, средней таблицы, которые содержат relationships между users и users' friends

Когда вы вызываете @user.friends, цель состоит в том, чтобы найти friends@user.Он должен объединить users таблицу и friendships таблицу, где friendships.user_id = @user.id, затем он получает все friend_id из этих friendships записей и найти users, у которого id включен в этот friend_ids массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...