Зачем дружить за социальные ссылки в Rails? - PullRequest
1 голос
/ 08 марта 2011

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

Сначала я следовал этому, но по мере продвижения вперед, кажется, что такие вещи, как 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 ... но это делает все грубое в контроллере контактов странным 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 голос
/ 08 марта 2011

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

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

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

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

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

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

0 голосов
/ 08 марта 2011

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

...