我有一张友谊表,
create_table "friendships", force: :cascade do |t|
t.integer "user_id"
t.integer "friend_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
end
当用户添加好友时,友情模型会创建一个新记录,其唯一ID为user_id
,friend_id
和name
值。
在我的角度应用中,我有一个重复每个friendship in friendships
的模板。
这是添加好友时的json结果,
[{"id":17,"friend_id":3,"name":"Kees Keesen"}]
id是友谊的id,friend_id
是朋友的实际用户ID。
所以我现在正在做的是复制我的数据。我有一个包含姓名,电子邮件等的用户模型。但是当我添加一个朋友时,我必须为友谊记录添加一个名称值(以及更多)。
这是来自users.json,
的json结果{"id":3,"email":"kees@kees.nl","name":"Kees Keesen"}
所以可以保持友谊unqique id(我需要删除友情记录),但是建立一个用户模型的链接,这样我就不必复制我的数据了吗?
*更新*
这是我的友谊控制者,
def index
friends = current_user.friendships.as_json
# friends = current_user.friends.as_json(:only => [:name, :email, :id])
render :json => friends
end
我已将此添加到我的用户模型
has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user
这是我的友谊模式,
belongs_to :user
belongs_to :friend, :class_name => "User"
我已经从友谊表中删除了名称列,友情的json输出现在是
[{"id":2,"user_id":1,"friend_id":1,"created_at":"2015-12-29T19:24:28.788Z","updated_at":"2015-12-29T19:24:28.788Z"}]
答案 0 :(得分:1)
这里的幸福之路是自我指涉。
class User < ActiveRecord::Base
has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user
end
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: "User"
end
使用此解决方案,您将获得数据结构约束的唯一ID,为您的用户提供user_id
,为友谊的互惠方面获取friend_id
,这两者都有到User
模型以避免重复。这是一种非常常见的做事方式。
此处有一条注释:inverse_friendships
用于查询特定用户的添加者,而不是他们个人添加的用户。
<强>更新强>
要通过User
访问Friendship
信息,可以委派属性调用:
class Friendship < ActiveRecord::Base
... snip ...
delegate :name, :email, to: :friend
end
希望这有帮助!
答案 1 :(得分:0)
在角度方面,您应该创建一个方法来获取用户id,后者访问幕后的缓存。然后,当您获得友谊时,使用此方法将id替换为它们所代表的用户对象。如果已经看到用户,则无需再次从服务器请求它。 JSON格式的缺点是无法表示链接,因此我们倾向于使用ID,而只需在获取对象后将它们转换为链接。