所以我为这些问题看起来多么愚蠢而道歉。我是 Rails 的新手,作为第一项任务,我还引入了 Neo4J,因为如果我发展这个项目,它似乎是最合适的。
我将解释操作流程,然后展示一些示例代码。我现在正在尝试添加第 3-5 步。
- 用户通过FB登录
- 第一次登录会创建一个用户节点。如果用户存在,它只是检索该用户+节点
- 用户节点创建后,通过koala gem 访问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
友谊.rb
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
方法中并如此正确地检索用户和朋友节点,以便我可以将两者链接在一起。
现在它不知道 user 和friend_user 是节点
如果您看到其他不良代码实践,请告诉我!
提前:感谢@subvertallchris 的帮助。我相信你会像这样回答我的很多问题。