Как определить эти отношения владельца/участника в Neo4j.rb?

Я пытаюсь понять, как определить эти отношения владельца/члена в моих моделях Neo4j.rb Active::Node.

  • Пользователи могут создавать множество команд (и становиться «владельцами» этих команд)
  • Пользователи могут получить команды, которые они создали
  • Команды имеют одного владельца (пользователя) и много участников (других пользователей).
  • Владельцы могут добавлять других пользователей в качестве членов команды
  • Пользователи могут получить все команды, владельцами или членами которых они являются.

Пока у меня есть что-то вроде этого, но оно работает неправильно, и я полностью потерян.

class User
  include Neo4j::ActiveNode
  has_many :out, :my_teams, model_class: 'Team'
end

class Team
  include Neo4j::ActiveNode
  property :name, type: String
  has_one :in, :owner, model_class: 'User'
end

user = create(:user)
team = build(:team)
user.my_teams << team
expect(team.owner).to eq user

person Andrew    schedule 19.06.2015    source источник


Ответы (1)


Во-первых, вы должны убедиться, что вы используете 5.0.0 драгоценных камней, которые были выпущены только вчера (ура!)

Во-вторых (и вы должны получать сообщения об этом при обновлении), вы должны указать опцию type для своих ассоциаций, например:

class User
  include Neo4j::ActiveNode
  has_many :out, :my_teams, type: :OWNS_TEAM, model_class: 'Team'
end

Это сообщает ActiveNode, какие типы отношений использовать для создания и запроса.

Наконец, для создания вы используете методы класса для классов модели, например:

user = User.create
team = Team.create

user.my_teams << team

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

person Brian Underwood    schedule 19.06.2015
comment
Спасибо. У меня еще остались вопросы... в чем смысл определения типа отношений? Как это используется? Как узнать, в каком направлении текут отношения? Кажется, это может пойти по любому пути. - person Andrew; 23.06.2015
comment
Также вы упоминаете, что я должен просто называть это командами. Но мне интересно, как определить отношения пользователя, который является членом команды. Я хотел бы иметь возможность позвонить .teams, чтобы получить обе команды, которые я создал, а также команды, членом которых я являюсь. - person Andrew; 23.06.2015
comment
Что касается опции type, она определяет type (что-то вроде метки) или отношение в Neo4j. Это может быть все, что вы хотите, и да, это определенно может пойти по любому пути. Это часть бессхемной природы отношений Neo4j, которая заключается в том, что вам решать, как вы хотите моделировать - person Brian Underwood; 24.06.2015
comment
Что касается команд, в которых вы одновременно являетесь владельцем и членом, я не думаю, что в настоящее время возможно определить несколько типов отношений для ассоциации (хотя, возможно, нам следует это поддерживать). Вы можете определить ассоциации для обоих, а затем вызвать user.owned_teams + user.teams. В некоторых случаях может иметь смысл, чтобы каждый владелец также был участником, и поэтому у вас будет две связи между одними и теми же узлами. - person Brian Underwood; 24.06.2015