1

看了很多关于 Rails 中社交链接系统的教程。我注意到似乎一直使用朋友作为用户对象的别名,并使用连接模型“友谊”。

起初我遵循了这一点,但随着我的前进,它似乎使事情变得create.friend非常迟钝。现在在我的示例中,我使用术语“联系人”和“连接”......当我列出所有用户的联系人时,我希望通过联系人控制器和视图( /contacts , /contacts/搜索、/contacts/create 等),但所有的杂乱无章都真正处理了连接(友谊)表……当我走的时候,这似乎真的倒退了。

为什么这样做?我看到的唯一好处是可以说“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 ......但它使联系人控制器中的所有垃圾都变得奇怪恕我直言。例如:

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 来显示电子邮件?

4

2 回答 2

1

我不确定我是否完全遵循你的问题,但希望这会给你足够的答案,要么回答你的问题,要么以更容易回答的方式发布它。

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

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

当您创建模型时,您不必将它们视为与控制器一对一的关系。您的资源与您的模型是分开的......

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

我希望这会有所帮助,如果您有任何其他问题,请发表评论,我会更新这篇文章。

于 2011-03-08T20:32:00.380 回答
0

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

于 2011-03-08T20:10:30.283 回答