Так что прошу прощения за то, что эти вопросы могут показаться нубскими. Я новичок в рельсах, и в качестве первой задачи я также использовал Neo4J, так как он показался мне наиболее подходящим, если я буду расширять проект.
Я объясню последовательность действий, а затем покажу пример кода. Я пытаюсь добавить на шаге 3-5 сейчас.
- Пользователь авторизуется через FB
- При первом входе создается пользовательский узел. Если пользователь существует, он просто извлекает этот пользователь + узел
- После создания пользовательского узла гем koala используется для доступа к FB Graph API.
- Получает список друзей каждого друга с помощью приложения.
- Пройдитесь по каждому другу и добавьте двусторонние дружеские отношения между двумя пользователями.
Поскольку 3-5 должно произойти только при первом присоединении пользователя, я подумал, что могу сделать это в методе, связанном с after_save
обратным вызовом. Однако в этой логике есть недостаток, так как в какой-то момент мне нужно будет обновить пользователя с дополнительными атрибутами, и он снова вызовет after_save. Могу ли я предотвратить это с помощью обновления?
SessionsController для справки
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
redirect_to root_url
end
def destroy
session.delete(:user_id)
redirect_to root_path
end
Итак, в моем user.rb у меня есть что-то вроде этого
has_many :both, :friendships
after_save :check_friends
def self.from_omniauth(auth)
@user = User.where(auth.slice(:provider, :uid)).first
unless @user
@user = User.new
# assign a bunch of attributes to @user
@user.save!
end
return @user
end
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
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
дружба.рб
from_class User
to_class User
type 'friendship'
def self.create_friendship(user,friend_node)
friendship = Friendship.create(from_node: user, to_node: friend_node)
end
Я не уверен, что я на правильном пути, как создать узел отношений. Поскольку я только что создал @user
, как мне включить это в мой метод check_friends
и получить узел пользователя и друга так правильно, чтобы я мог связать их вместе.
Прямо сейчас он не знает, что пользователь и друг_пользователь являются узлами
Если вы видите другую практику плохого кода, пожалуйста, дайте мне знать!
Заранее: спасибо за помощь @subvertallchris. Я уверен, что вы ответите на многие мои вопросы, подобные этому.