Rails итерация с некоторыми умами - PullRequest
0 голосов
/ 06 февраля 2011

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

  1. Выберите одного из своих "друзей"
  2. Найти совпадение этого друга
  3. Если я не могу найти совпадения друзей, за которые ранее голосовал, получим случайное совпадение

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

found_new_match = false

#Try connected users first
# connected_users = current_user.get_connected_users
connected_users = []

unless connected_users.blank?
  user = connected_users.shuffle.first
  @match = user.matches.first
end

# Here i'd like to detect whether we got through all our connections' matches
while found_new_match == false do 
  found_new_match = true if @match = current_user.get_random_new_match
end

Ответы [ 2 ]

1 голос
/ 06 февраля 2011

Предполагая, что вся логика поддержки вашего кода (получение подключенных пользователей) работает правильно, и ваш вопрос состоит в том, как свернуть эту логику в одну строку, следующее должно работать нормально:

  @match = current_user.get_connected_users.shuffle.first.try(:matches).try(:first) || current_user.get_random_new_match

Если выучтя «первое совпадение пользователя» (user.matches.first) в своем собственном методе доступа, вы можете пропустить ужасно выглядящий .try(:matches).try(:first).Вы могли бы дополнительно учесть «первое случайное совпадение» в удобном методе на User, чтобы код сокращался еще дальше:

  @match = current_user.get_random_connected_match || current_user.get_random_new_match

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

0 голосов
/ 06 февраля 2011

Я принял ваш совет и пошел с:

@match = current_user.get_random_connected_match || current_user.get_random_new_match

В моем методе у меня есть:

connected_users = self.get_connected_users.map(&:id)
my_voted_matches = self.votes.map(&:matching_id)

Matching.first(:conditions => ["id NOT IN (?) AND (user_id IN (?) OR matched_id IN (?))", my_voted_matches.join(","), connected_users.join(","), connected_users.join(",")], :order => "RAND()")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...