Neo4j рб наследование

Я использую Neo4j.rb в своем приложении для рельсов. У меня проблемы с полиморфизмом.

У меня есть что-то вроде этого. У меня есть класс Users, который выглядит так:

class User 
  include Neo4j::ActiveNode 

  #other properties

  has_many: out, :social_media_content, model_class: :SocialMediaContent
end

У меня есть класс SocialMediaContent

class SocialMediaContent   
  include Neo4j::ActiveNode # Is it necessary?

  property :first_name, type: Integer
  property :first_name, type: Integer

end 

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

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

i.e

class Image < SocialMediaContent
  include Neo4j::ActiveNode #Do i have to do this?

Я хочу такого поведения: у каждого пользователя есть много SocialMediaContent, который может быть либо изображением, либо видео (на данный момент), я не хочу сейчас указывать, какой из них является изображением, а какой видео.

Может ли кто-нибудь предложить, как я могу добиться этого? И, наконец, могу ли я хранить массив SocialMediaContent вместо ассоциаций has_many (что лучше?)


person Artemis Fowl    schedule 19.10.2015    source источник


Ответы (1)


Да, вы определенно можете это сделать. В Neo4j.rb, когда вы наследуете класс от класса ActiveNode, дочерний класс представляет узлы с обеими метками. Например:

class SocialMediaContent
  include Neo4j::ActiveNode # This is necessary for the parent
end

class Image < SocialMediaContent
  # No include needed
end

class Video < SocialMediaContent
  # No include needed
end

Теперь, если вы сделаете Image.create, будет создан узел с метками Image и SocialMediaContent. Если вы ищете изображение с Image.find, Image.where и т. д., оно будет ограничено только узлами с обеими метками.

Что касается ассоциации, вы должны иметь возможность указать ее, как она есть в вопросе (хотя она будет жаловаться, если у вас нет опции type, rel_class или origin).

person Brian Underwood    schedule 19.10.2015
comment
Этот ответ устарел сейчас? Я без проблем использовал наследование в виде STI. - person Tyrone Wilson; 04.01.2017
comment
Я так не думаю, я думаю, что ответ говорит о том, что вы можете использовать наследование в стиле STI, верно? - person Brian Underwood; 09.01.2017
comment
Возможно, я неправильно понял. Я думал, что ответ заключался в том, что поиск через суперкласс будет возвращать только узлы с обеими метками подкласса. Виноват - person Tyrone Wilson; 09.01.2017
comment
Ах, не беспокойтесь. Да, я думаю, что в целом это должно работать так, как люди ожидают. - person Brian Underwood; 09.01.2017