Проверка, включает ли массив объектов какой-либо объект из массива

#ruby-on-rails #arrays #ruby-on-rails-3.2

#ruby-on-rails #массивы #ruby-on-rails-3.2

Вопрос:

У меня есть массив объектов, называемых posts, и у меня есть комментарий в c1 в виде массива комментариев пользователя Bob. Связь между сообщением и комментарием заключается в том, что сообщение имеет множество комментариев.

 c1 = Comment.where(user: "Bob")
# c1 contains comment array, e.g. [#<Comment id: 23, ... >]

posts = Post.all.select{|p| p.comments.include?(c1) }
# p.comments returns comments for that post, e.g. [#<Comment id: 23, ... >]
  

Если p.comments должен был возвращать один элемент массива, а c1 имел один элемент массива, как показано в комментариях в разделе кода выше, сравнение обоих значений возвращает true, тогда как p.comments.include?(c1) возвращает false. Я хочу отфильтровать все сообщения, содержащие комментарии Боба.

Ответ №1:

Вы хотите добавить include связанные записи в свой запрос, затем соответствующим образом их отфильтруйте:

 Post.includes(:comments).where(comments: { user: 'Bob' })
  

Вот еще немного информации о запросах Rails Active Record

https://guides.rubyonrails.org/active_record_querying.html

Ответ №2:

Не уверен, в чем ваша основная задача, но позвольте мне угадать:

Если вы хотите выводить комментарии от пользователя — вам нужно использовать ассоциации и избегать кода ruby.

Например, вы можете добавить что-то вроде:

 class User
  has_many :commented_posts, class_name: "Post", through: :comments, sources: :commentable

# or source: :post (not sure what relation you have)
# so you can do @user.commented_posts