#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
Ответ №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