! , , , .
has_many. node, ActiveRel, - :
has_many :both, :friends, model_class: 'User', rel_class: 'Friendship'
.
, Neo4j. , , . FRIENDS_WITH .
, .
! , ! after_save / .
class SessionsController < ApplicationController
def create
user = User.from_omniauth(env["omniauth.auth"])
@user = user.nil? ? User.create_from_omniauth(env["omniauth.auth"]) : user
session[:user_id] = @user.id
redirect_to root_url
end
def destroy
session.delete(:user_id)
redirect_to root_path
end
end
class User
include Neo4j::ActiveNode
has_many :both, :friends, model_class: 'User', rel_class: 'Friendship'
def self.from_omniauth(auth)
User.where(auth.slice(:provider, :uid)).limit(1).first
end
def self.create_from_omniauth(auth)
user = User.new
if user.save!
user.check_friends
else
end
user
end
end
, . , .
. check_friends:
def check_friends(friendships)
facebook.get_connection("me", "friends").each do |friend|
friend_id = friend["id"]
friend_node = User.where(friend_id)
Friendship.create_friendship(user,friend_node)
return true
end
end
, . , , node, find_by. , facebook_id.
def check_friends
facebook.get_connection("me", "friends").each do |friend|
friend_node = User.find_by(facebook_id: friend["id"])
Friendship.create_friendship(user,friend_node) unless friend_node.blank?
end
end
create_friendship true false, , , , . :
def self.create_friendship(user, friend_node)
Friendship.new(from_node: user, to_node: friend_node).save
end
create true false, , save , . , .
after_create ActiveRel, - from_node, , . , . , ActiveRel .
, , . facebook . .
module Facebook
extend ActiveSupport::Concern
def facebook
@facebook ||= Koala::Facebook::API.new(oauth_token)
block_given? ? yield(@facebook) : @facebook
rescue Koala::Facebook::APIError => e
logger.info e.to_s
nil
end
def friends_count
facebook { |fb| fb.get_connection("me", "friends", summary: {}) }
end
end
class User
include Neo4j::ActiveNode
include Facebook
end
. . !
. , - - , , , , . , .