Rails Active Record найти все, включая дубликаты - PullRequest
1 голос
/ 13 мая 2011

Как я могу получить дубликаты сообщений на мой взгляд?

Я хочу иметь возможность сделать что-то вроде этого:

@ post = post.find (1,2,1)

чтобы вернуть сообщение 1, сообщение 2, а затем сообщение 1 (снова).

понимаю, что это глупый вопрос, но я не могу найти никакой документации.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Хотя я не уверен насчет варианта использования, вы можете сделать что-то вроде:

@posts = Post.find(1,2) << Post.find(1)

из вас могут определить это в вашей модели Post:

def find_with_array(*args)
   posts = []
   for arg in args
     posts << Post.find(arg)
   end
   posts
end

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

def find_with_array(*args)
  posts_with_no_duplicates = Post.find(args)
  posts_with_duplicates = []
  for arg in args
    for post in posts_with_no_duplicates
       if arg == post.id
         posts_with_duplicates << post
       end
    end
  end
end

Это должно быть лучше, так как вы делаете только один вызов БД (обычно самая медленная часть), однако это O (N ^ 2). Возможно, есть способ сделать это O (N), если это будет необходимо. Однако это большое улучшение по сравнению с предыдущим вариантом

0 голосов
/ 13 мая 2011

Не зная более подробно, вот что я бы посоветовал. Посмотрите на этот пост относительно массивов флажков: http://www.skuunk.com/2008/05/checkbox-arrays-in-rails.html

Каждый флажок сбрасывает значение в определенный ключ params. Это решит проблему получения массива со списком значений. Дайте мне знать в комментариях, если это не решит вашу конкретную проблему.

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