Зачем дружить за социальные ссылки в Rails?

Глядя на множество учебных пособий по системам социальных ссылок в рельсах. Я заметил, что, похоже, существует постоянное использование друзей в качестве псевдонима для пользовательских объектов с моделью соединения "дружеские отношения".

Сначала я следил за этим, но по мере продвижения вперед, кажется, что create.friend действительно тупой. Теперь в моем примере я использую термины "контакт" и "соединение"... Когда я перечисляю все контакты пользователя, я ожидаю сделать это через контроллер контактов и просмотра ( /contacts, /contacts/search, /contacts/create и т. д.), но все это на самом деле имеет дело с таблицей соединений (дружбы)... это начинает казаться действительно задом наперед.

Почему так сделано? Единственное преимущество, которое я вижу, это возможность сказать что-то вроде "contact.email", но я не уверен, что дополнительная абстракция и гимнастика в моем коде того стоят. Я был бы так же рад сказать, contact.user.email.

Ссылка на страницу контактов? link_to contact.user (право?)

Есть ли какой-то фол, если у меня просто есть модель "контактов" со стандартными, очевидными, грубыми структурами и я отказываюсь от этого наложения пользовательской модели? Честно говоря, я не вижу большого выигрыша в том, чтобы возиться с пользовательской моделью вообще намного больше, чем аутентификация... Я помещаю всю информацию для пользователя в профиль.

Или я что-то упустил?

ОБНОВЛЕНИЕ: я, кажется, неясно, поэтому я уточню.

План А:

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... но это делает все грубое в контроллере контактов странным imho. НАПРИМЕР:

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

Мне было интересно, почему очевидное отключение?

ОБНОВЛЕНИЕ 2:

Итак, я понял... контакт должен быть ссылкой на модель пользователя... не обойтись. 3 шага независимо от этого события. Однако я все еще смущен некоторыми тонкостями, когда пытаюсь выполнить этот путь:

Является ли нарушение mvc наличием contacts_controller.rb с таким кодом:

  # 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 ответа

Решение

Я не уверен, что полностью слежу за вашим вопросом, но, надеюсь, этого вам хватит, чтобы ответить на ваш вопрос или опубликовать его таким образом, чтобы он был более ответственным.

Причина, по которой вы бы смоделировали отношения дружбы как модель объединения, заключается в том, что дружба направлена, поскольку "потому что у меня дружба с вами, это не значит, что вы дружите со мной". Если вы рассматриваете случай, когда я создаю дружбу с вами, это не обязательно будет действительным, пока вы не подтвердите дружбу и не создадите ассоциацию, которая указывает в другом направлении.

Другая причина моделирования дружбы как отдельной сущности заключается в том, что она позволяет вам обогатить модель, чтобы вы также могли указать, как вы знаете этого человека, или даже ссылку на человека, который вас представил.

Когда вы создаете модели, вы не должны думать о них как о 1-1 с контроллерами. Ваши ресурсы отделены от ваших моделей...

Во многих приложениях у вас есть модель пользователя и модель профиля. Они часто имеют отношения 1-1, и люди часто задаются вопросом, почему они не смоделированы как единое целое. Если честно, нет никакой конкретной причины, почему вы не можете моделировать как одну и ту же сущность, но есть несколько преимуществ их разделения. Для начала вы можете удалить учетные данные пользователей, не удаляя их профиль (это хорошо, если кто-то хочет удалить их учетную запись, но вы не хотите / не должны удалять их содержимое.) Например, вы удаляете свою учетную запись Facebook и свою на фотографиях с тегами по-прежнему будет отображаться ваше имя, но не ссылка на ваш профиль (я не знаю, так ли это на самом деле, это просто пример.) Есть и другие более мягкие причины, такие как одиночная ответственность, разделение интересов и т. д.... которые являются "хорошими практиками" и, надеюсь, должны упростить поддержку вашего приложения.

Надеюсь, это немного поможет, если у вас возникнут дополнительные вопросы, оставьте комментарий, и я обновлю этот пост.

Модель объединения существует по одной основной причине: пользователь может быть другом для нескольких человек. Если вы не ожидаете, что пользователи будут делиться многими контактами, я бы избавился от объединения.

Другие вопросы по тегам