Создание семейства пользователей в Rails - PullRequest
1 голос
/ 21 октября 2019

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

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

Вот что у меня есть

class User < ActiveRecord::Base
# this defines the parent to members fine and you can get them
# only if you have the parent
  has_many :memberships, :class_name => 'Family', :foreign_key => 'user_id'
  has_many :family_members, :through => :memberships, :source => :registrar
# trying to define that user is also a member of family 
 belongs_to :registrar_family, :foreign_key => 'member_user_id'
end

class Family < ActiveRecord::Base
  belongs_to :user, :class_name => 'User', :foreign_key => "user_id"
  has_many :users, :class_name => 'User', :foreign_key => "id"
end

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

user.family_members # to get family members for this parent 

, но как это сделать? Я делаю так, что я также могу получить полную семью от членов

примеры DB

Users:
  id, name
 1, King
 2, Queen
 3, Prince
 4, Duaghter 
Users Family: 
 id,user_id, member_user_id
 1, 1, 2
 1, 1, 3 
 1, 1, 4

Как мне сказать что-то вроде

user = User.find(4)
user.family.parent.members # which would return a family association 

Полное решениеибо это (если кому-то интересно):

class User < ActiveRecord::Base
  def family
    members = Family.where("user_id = ? OR member_user_id = ?", self.id, self.id)
    # if members is only 1 person then this person is a member only
    # then get all members from parent
    if members.count == 1
      members = members.first.parent.family
    end
    members
  end

  def family_count
    # if there is family then count is family + parent else 0
    family.count > 0 ? family.count + 1 : 0
  end

end

class Family < ActiveRecord::Base
  belongs_to :parent, :class_name => 'User', :foreign_key => "user_id"
end

1 Ответ

2 голосов
/ 22 октября 2019

Возможно, у вас есть причины, по которым вы не упомянули, зачем вам нужен класс Family. Но для простой реализации вы можете сделать все это в модели User:

class User < ApplicationRecord
  def is_parent?
    parent_id.nil?
  end

  def family
    User.where(id: id_of_parent).or(User.where(parent_id: id_of_parent))
  end

  private
  def id_of_parent
    is_parent? ? id : parent_id
  end
end

, если таблица пользователей содержит

| id | first_name | parent_id |
| 1  | Fred       |  nil      |
| 2  | Wilma      |  1        |
| 3  | Pebbles    |  1        |
| 4  | Barney     |  1        |

Тогда:

> User.find(1).family.map(&:first_name) # -> [Fred,Wilma,Pebbles,Barney]
> User.find(2).family.map(&:first_name) # -> [Fred,Wilma,Pebbles,Barney]

Вы можете добавить самообъединение в модель User, если хотите, но это мало что добавляет:

Class User < ActiveRecord::Base
  belongs_to :parent, class_name: 'User', foreign_key: :parent_id

  etc...

Я понимаю, что это не точно , что вы просили, ноэто отвечает вашим потребностям?

...