合并两个Rails模型

时间:2015-12-29 18:39:21

标签: ruby-on-rails

我有一张友谊表,

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_idfriend_idname值。

在我的角度应用中,我有一个重复每个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"}]

2 个答案:

答案 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,而只需在获取对象后将它们转换为链接。