Я предполагаю, что post
является объектом ActiveRecord и messages
является has_many
отношением на этот класс.
При вызове post.messages
вы не сразу получаете массив. Вместо этого Rails сначала создает объект ActiveRecord::Relation
, который содержит запрос, который вы только что создали, прежде чем он будет выполнен. Это позволяет вам подключать методы поиска (например, where
, select
, ...) и создавать полный запрос перед его отправкой в базу данных для его выполнения.
Теперь, поскольку у вас нет массива, его методы могут работать по-разному (и принимать разные аргументы), чем методы Array. Метод uniq
в этом случае является псевдонимом distinct
, который указывает, что запрос должен быть создан как DISTINCT
. Поскольку вы еще не имеете дело с реальным массивом объектов, фильтрация с помощью блока пока не работает.
Чтобы решить эту проблему, у вас есть два варианта:
Вы можете заставить ActiveRecord для выполнения запроса и возвращает массив с помощью метода to_a
, где вы можете использовать uniq
метод массива с блоком как вы пытались выше:
post.messages.to_a.uniq { |x| x.user_id }
вы можете создать соответствующий запрос возвращает только данные, которые вы на самом деле нужно. Это может быть сложным в этом случае, поскольку требуемый SQL, вероятно, довольно сложный и может не поддерживаться генератором запросов ActiveRecord (и это будет создано вручную). См. this question, чтобы узнать, как создать соответствующие запросы.
У меня все еще недостаточно репутации для +1, но это работает так хорошо! –
однако это не работает с PostgreSQL (HEROKU) –