Самостоятельная ссылка в отношениях счетчика контроллеров - PullRequest
1 голос
/ 11 июня 2011

У меня реальная проблема с извлечением набора записей, которые имеют относительную привязку к пользователю, чтобы отобразить их на странице показа.

Вот идея:

Пользователи (current_user) оценивают совместимость между двумя другими пользователями (user_a и user_b).Они могут оценивать совместимость как положительно, так и отрицательно: оценка «совместимых» двух пользователей создает positive_connection между user_a и user_b, а оценка «несовместимых» - negative_connection.Таким образом, есть модели для Positive_connection, негативных_коннекций и пользователей.

Теперь мне нужно отображать только пользователей, которые overall_positively_connected_to(@user) (то есть, где positive_connections_to(@user).count > negative_connections_to(@user).count).

Это то, где я должен, но я не могу получить больше:

Модель пользователя:

  def overall_positive_connected_to(user)
      positive_connections_to(user).count > negative_connections_to(user).count
  end


  def positive_connections_to(user)
      positive_connections.where("user_b_id = ?", user)
  end     

  def negative_connections_to(user) 
      negative_connections.where("user_b_id = ?", user)
  end

Контроллер

@user.user_bs.each do |user_b|
  if user_b.overall_pos_connected_to(@user)
    @compatibles = user_b
  end
end

Код в контроллере явно неправильный, но как следуетЯ собираюсь сделать это? Я совершенно новичок в rails (и sql), поэтому, возможно, сделал что-то наивное.

Любая помощь будет отличной.

1 Ответ

1 голос
/ 14 июня 2011

Так что я прав, говоря, что у вас есть 3 модели

  • Пользователь (идентификатор, имя)
  • PositiveConnection (user_a_id, user_b_id)
  • NegativeConnection (user_a_id, user_b_id)

Или что-то в этом роде.

Я думаю, вы просто хотите 2 модели и для удобства я собираюсь переименовать отношения как "from_user" и "to_user"

  • Пользователь (идентификатор, имя)
  • Соединение (значение: целое, from_user_id, to_user_id)

Где значение -1 для отрицательного и +1 за позитив.

Теперь мы можем сделать что-то вроде (примечание: вам нужно разобраться в точном синтаксисе, например: foreign_key и: source, и прочее)

class User

  has_many :connections, :foreign_key => "from_user_id"
  has_many :connected_users, :through => :connections, :source => :to_user

  def positive_connections
    connections.where(:value => 1)
  end

  def negative_connections
    ...
  end

end

Но теперь у нас также есть структура для создания сложного SQL-запроса. (опять нужно заполнить пробелы ... но что-то вроде)

class User

  def positive_connected_users
    connected_users.joins(:connections).group("from_user_id").having("SUM(connections.value) > 0")
  end

end

это не совсем сработает но это своего рода псевдокод для реального решения

(может быть, лучше подумать в чистом выражении sql)

SELECT users.* FROM users
INNER JOIN connections ON to_user_id = users.id
WHERE  from_user_id = #{user.id}
HAVING SUM(connections.value) > 0
...