我正在使用Rails上的REST服务器,用户可以与其他用户建立友谊关系。为了表示这种关系,我使用的是“友谊”连接表,它具有“状态”属性,用于指示关系是否已被接受,拒绝,取消或待处理。
在我的用户模型上,我有类似的内容:
has_many :friendships
has_many :friends, -> { where(friendships: {status: 2})}, through => :friendships
has_many :requests, -> { where(friendships: {status: 1})},
:class_name => "Friendship", :foreign_key => "friend_id"
has_many :pending_friends, :through => :requests, :source => :user
和其他几个表示反向的关系(当用户是那个要求的那个时)。在我的友谊模型上:
belongs_to :user
belongs_to :friend, :class_name => "User"
现在我要做的是提供一个服务,用户可以检查他所有的友谊和友情请求,当然还有其他用户的一些数据,所以我不必为此做额外的请求。所以我正在做的是:
friendships = current_user.friendships.where(status: 2).includes(:friend)
.as_json(include: {friend: {only: [:id, :username, :photo_url]}})
requests = current_user.requests.includes(:user)
.as_json(include: {user: {only: [:id, :username, :photo_url]}})
render json: {friendships: friendships, requests: requests}, status: 200
现在我一直在测试,当用户有1000个友情关系时,加载它可能需要5秒钟。但是,如果我从only: [:id,..]
中删除as_json
,它将在1秒内运行,但它将拥有所有用户的信息。如果我完全移除as_json
它将在0.4秒内运行,但我只会获得友谊的信息,并且不会包含其他用户的信息。
为了记录我在Laravel上构建相同的应用程序,我应该找出哪种框架/语言最适合我们的情况。在那个Laravel应用程序中,由于ORM在数组结构中构建对象并允许您决定从连接表中带来哪些数据,因此在0.5秒内完成此操作更容易。所以告诉我Rails对我想做的事情并不是那么好,切换到Laravel是我猜的可接受的响应。
答案 0 :(得分:1)