为什么在Rails中进行社交链接的友谊?

时间:2011-03-08 19:52:05

标签: ruby-on-rails social-network-friendship

查看有关rails中社交链接系统的大量教程。我注意到,似乎一直使用朋友作为用户对象的别名,使用连接模型“友谊”。

我一开始就跟着这个,但是当我前进时,它似乎使create.friend之类的东西变得非常钝。现在在我的例子中,我使用术语“联系人”和“连接”......当我列出所有用户的联系人时,我希望通过联系人控制器和视图(/ contacts,/ contacts /搜索,/联系人/创建等等。)但所有的crud真的处理连接(友谊)表......这开始看起来真的倒退了。

为什么这样做? 我看到的唯一好处是可以说“contact.email”之类的内容 但我不确定我的代码中的额外抽象和体操是否值得。我会很高兴地说contact.user.email.

链接到联系人页面? link_to contact.user(对吧?)

如果我只是拥有标准,明显,粗糙结构的模型“联系人”并且放弃用户模型的这种混淆,是否有任何犯规?坦率地说,除了身份验证之外,我根本没有看到弄乱用户模型的好处......我正在为用户提供所有信息。

或者我错过了什么?

更新:我似乎不清楚,所以我会详细说明。

计划A:

def contact
 belongs_to :user
 belongs_to :connection, :class_name => 'User', :foreign_key =>'contact_id'
 validates_uniqueness_of :contact_id, :scope => :user_id, :message => ' allready one of your contacts.'
 attr_accessor :invite
end

然后按照正常的CRUD进行操作。转到我的“联系人”页面会显示我的所有联系人正常的crud操作等...要获得联系人的电子邮件,我会在这种情况下说:contact.connection.email

然后我做了一些阅读,看到其他人都这样做了:

class Connection < ActiveRecord::Base

  belongs_to :user
  belongs_to :contact, :class_name => 'User', :foreign_key =>'contact_id'

  validates_presence_of :user_id
  validates_presence_of :contact_id
  validates_uniqueness_of :contact_id, :scope => :user_id, :message => ' allready one of your contacts.'

  attr_accessor :invite
  end

然后使用联系人控制器(朋友控制器)来处理这里的问题。唯一的好处似乎那么你可以说contact.email ...但它使联系人控制器中的所有crud奇怪的imho。 EG:

http://railsforum.com/viewtopic.php?id=16760

我想知道为什么明显断开连接?

更新2:

所以我明白了...联系人必须是对用户模型的引用......没有解决这个问题。无论如何都需要3个步骤。但是,当我尝试沿着这条路径执行时,我仍然对一些优点感到困惑:

使用以下代码的contacts_controller.rb是否违反了mvc:

  # in contacts_controller.rb
def destroy 
    @connection = Connection.find(params[:id])
    @connection.destroy

    respond_to do |format|
      format.html { redirect_to :action=>'index' }
      format.xml  { head :ok }
    end  
  end

然后当我尝试执行form_for @connection,路由错误等等时,它会变得奇怪。 我知道我正在洗这个问题并非常感谢到目前为止的所有反馈。

更新3:

这里举例说明了我对这些关系的困惑:

<% @contacts.each do |contact| %>
    <li><%= contact.email %> <%= link_to 'Remove Contact', contact.connection, :confirm => 'Are you sure?', :method => :delete %></li>
<% end %>

在遍历用户的联系人时,如何巧妙地调用在列表中显示此联系人的连接以进行删除?也许我应该迭代用户的连接,拉动connection.contact.email来显示电子邮件?

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全听从了你的问题,但希望这会给你足够的回答你的问题就是以一种更负责任的方式发布它。

你之所以将友谊关系建模为一个联合模式,是因为友谊是有方向性的,因为“因为我和你有友谊并不意味着你和我有友谊”。如果你考虑我与你建立友谊的情况,那么在你确认友谊并创建指向另一个方向的关联之前,它不一定有效。

将友谊建模为一个单独的实体的另一个原因是,它可以让您丰富模型,因此您还可以包括您如何认识这个人,甚至包括介绍您的人的链接。

创建模型时,不一定要将它们视为具有控制器的1-1。您的资源与您的模型分开......

在许多应用程序中,您拥有用户模型和配置文件模型。这些通常具有1-1关系,人们常常想知道为什么他们不被建模为一个实体。说实话,没有具体的理由说明为什么你不能模型作为同一个实体,但保持它们分开有一些好处。首先,您可以删除用户登录凭据而不删除他们的个人资料(如果有人想要删除他们的帐户,但您不想/需要删除他们的内容,那就太棒了。)例如,您删除了您的Facebook帐户和您的标记的照片仍会显示您的姓名,但不会显示您的个人资料的链接(我不知道这是否真的如何运作,这只是一个例子。)还有其他更为温和的原因,如单一责任,分离关注等。 ..这是“良好做法”,应该有助于使您的应用程序更易于维护。

我希望这会有所帮助,如果您有任何进一步的问题留下评论,我会更新这篇文章。

答案 1 :(得分:0)

加入模型有一个主要原因,用户可以成为多个人的朋友。如果你不希望用户分享很多联系人,我会摆脱加入。