2015-04-13 11 views
0

Рассмотрим эту простую схему:Neo4jRB: Поиск по всем ассоциациям?

class Person 
    include Neo4j::ActiveNode 

    property :name, type: String 

    has_many :out, :follows, model_class: Person, rel_class: Friendship 
    has_many :in, :followed_by, model_class: Person, rel_class: Friendship 
end 

class Friendship 
    include Neo4j::ActiveRel 

    property :key, type: String 

    type 'friendship' 
    from_class Person 
    to_class Person 
end 

Как бы я искать через все Friendship с для тех, которые удовлетворяют условию? (например, Friendship с определенного ключа).

В электронном письме, Брайан Андервуд указывает мне на этот фрагмент:

ModelClass.association_name(:node_var, :rel_var).where("rel_var = 'some_condition'") 

Я пытался играть с ним, но не понимаю. Является ModelClass a ActiveNode или ActiveRel экземпляром? Что такое :node_var и :rel_var?

ответ

2

Если вы хотите найти любую дружбу, которая имеет определенную key свойства, вы бы сделать это так:

Person.all.follows.rel_where(key: your_key_var) 
# OR 
Person.all.follows(:f, :r).where('r.key = {key}').params(key: your_key_var) 

Они оба будет генерировать MATCH (p:Person)-[r:friends]->(f:Person), более или менее, в первом примере, используя авто -определенные идентификаторы узлов, а второй - f для узла узла-адресата и r для отношения, заданного аргументами :f, :r. После этого to_a вернет друга в КОНЕЦ цепи или вы можете позвонить pluck либо :f, либо :r, чтобы вернуть данные объекты.

Опция model_class всегда описывает класс NODE на другой стороне ассоциации. В примере Брайана и rel_var являются общими именами для идентификаторов, которые Cypher будет использовать в выражении, которое он создает.

+0

Отлично, глядя на сгенерированный запрос, эти параметры имеют больший смысл. Спасибо. –

Смежные вопросы