Neo4jrb Neo4j::Session::CypherError: uuid не определен

Я пытаюсь создать собственный метод getOrCreate, используя find, и если ничего не возвращается, используя create

мои занятия:

class User
  include Neo4j::ActiveNode
  include Neo4jrbConcern

  property :name
  property :email

  validates :name, :presence => true
  validates :email, :presence => true
end

метод getOrCreate унаследован от концерна

def getOrCreate(params)
  obj = self.find(params)
  if obj
    puts 'obj found : ' + obj
    return obj
  else
    return self.create(params)
  end
end

я пытаюсь это:

User.getOrCreate(
   name: data['name'],
   email: data['email']
)

Результатом является эта ошибка:

Neo4j::Session::CypherError: uuid not defined (line 1, column 86)
"MATCH (result_user:`User`) WHERE result_user.uuid.name = {result_user_uuid_name} AND uuid.email = {result_user_uuid_email} RETURN result_user ORDER BY ID(result_user) LIMIT {limit_1}"
                                                                                      ^
/Users/xxx/.rvm/gems/ruby-2.1.5/gems/neo4j-core-4.0.0/lib/neo4j-server/cypher_response.rb:166:in `raise_cypher_error'
/Users/xxx/.rvm/gems/ruby-2.1.5/gems/neo4j-core-4.0.0/lib/neo4j-core/query.rb:164:in `response'
/Users/xxx/.rvm/gems/ruby-2.1.5/gems/neo4j-core-4.0.0/lib/neo4j-core/query.rb:205:in `pluck'

ты видишь, что я сделал не так?

Спасибо!

Benoît

1 ответ

Решение

Вы не можете передать хеш в find как это. Это должно быть что-то вроде:

def getOrCreate(params)
  obj = self.where(params).first
  if obj
    puts 'obj found : ' + obj
    return obj
  else
    return self.create(params)
  end
end

Хотя это также кажется идеальным случаем для использования шифра MERGE Это означает, что вам нужно сделать только один запрос.

Другие вопросы по тегам