2014-11-24 6 views
1

Это довольно простой вопрос.Neo4j gem - Способ определения свойств отношений

Есть ли специальный метод для обновления свойств отношений в драгоценном камне? Я не могу сделать простой update_attributes или update.

Мои отношения созданы и обновление не определено для класса nil.

event = Event.find(params[:event]) 
invite = Invite.create_invitation(event, current_user, nil) #creates relationship 
invite.update(interested: params[:interest]) 

Есть ли другой способ, которым я должен пользоваться?

ответ

1

Всякий раз, когда вы получаете сообщение об ошибке undefined для класса nil, это должно быть немедленным сигналом для вас, что проблема - это переменная, на которую вы вызываете метод, а не метод, который вы вызываете. Другими словами, поскольку он говорит, что nil не имеет метода update, ваш фокус должен быть на переменной, которая фактически равна нулю. Вопрос здесь: почему invite возвращает nil вместо отношений?

Поскольку вы используете собственный метод класса для создания отношений, я предполагаю, что вы не говорите ему, чтобы он возвращал правильный объект. Он должен выглядеть примерно так:

def self.create_invitation(event, user, something_else = nil) 
    rel = InvitationRel.new(from_node: event, to_node: user) 
    if rel.save 
    rel 
    else 
    # return an error, maybe rel.errors.full_messages? 
    end 
end 

Затем вашему контроллеру необходимо проверить правильность создания rel.

event = Event.find(params[:event]) 
invite = Invite.create_invitation(event, current_user, nil) #creates relationship 
if invite.neo_id.nil? 
    # the rel did not create correctly, neo_id is only present on persisted objects 
else 
    invite.update(interested: params[:interest]) 
end 

Это кажется мне, как будто вы проделаете долгий путь по этой проблеме. Вам не нужно, чтобы отделить создание отношений и установление interested собственности, вы можете просто сделать это в один вызов к БД:

event = Event.find(params[:event]) 
invite = InviteRel.new(from_node: event, to_node: current_user, interested: params[:interest]) 
if invite.save? 
    # rel was created, move on 
else 
    # something wrong in the rel, figure out what it was 
end 

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

+0

Спасибо, Крис. Ruby обычно возвращает последний объект. Если вы просто имели 'InvitationRel.new (from_node: event, to_node: user) .save' Мне интересно, почему этот объект отношения не возвращается. Зачем нам явно возвращать его? Есть ли тонкое творение, о котором я не знаю? – Clam

+0

'save' не возвращает объект, на который он вызван, он возвращает логическое значение того, был ли объект сохранен или успешно сохранен. 'create' возвращает объект, но не указывает, был ли он успешным. Вот почему вы повсюду видите шаблон 'if obj.save then do_this else do_that end'. – subvertallchris