Область действия массива того же класса в Rails

У меня есть две модели Board и Pictures, и я хочу, чтобы пользователь мог комментировать либо Board в целом, либо отдельные Pictures.

Моя полиморфная модель комментария:

 class Comment < ActiveRecord::Base
     belongs_to :commentable, polymorphic: true
 end

а затем у меня есть простой has_many в каждой из других моделей:

 class Board < ActiveRecord::Base
     has_many :comments, as: :commentable, dependent: :destroy
     has_many :pictures

 class Pictures < ActiveRecord::Base
     has_many :comments, as: :commentable, dependent: :destroy
     belongs_to :board

Что я действительно хочу сделать, так это добавить новую область, называемую чем-то вроде all_comments, которая объединяет комментарии из модели Board с соответствующими комментариями из модели Pictures. Я могу сделать это с помощью метода, но в итоге я получаю массив, а не отношение с областью действия.

Мой метод:

def all_comments
    comments = self.comments
    return comments + self.pictures.map {|x| x.comments}.flatten
end

Как я могу вернуть отношение с ограниченной областью действия, которое может связать результаты?


person JoshL    schedule 24.04.2014    source источник
comment
См. здесь: stackoverflow.com/questions/9540801/   -  person Damien Roche    schedule 25.04.2014
comment
@DamienRoche вам нужно создать правильную область действия для предлагаемого вами решения, оно не будет работать с картой.   -  person phoet    schedule 25.04.2014
comment
@phoet спасибо, что указали на это.   -  person Damien Roche    schedule 25.04.2014


Ответы (2)


в первую очередь картинки должны быть единичными.

во-вторых, вы можете просто вызвать поисковик на комментарий, чтобы получить все комментарии, которые вы хотите

Comment.where("type = 'board' AND id IN(?) OR type = 'picture' AND id IN(?)", self.id, self.pictures.map(&:id))

или что-то вроде того.

person phoet    schedule 25.04.2014
comment
простота всегда является ответом. не могу поверить, что я не думал об этом! благодаря. - person JoshL; 25.04.2014

Ответ phoet меня заинтриговал (я +1), так что вот мой рефакторинг/расширение того, что он предложил:


Вы бы посмотрели на модель Comment, чтобы получить соответствующие комментарии. Для этого вам нужно сначала знать доску и изображения, связанные с ней. Phoet использует для этого объект self.pictures:

#app/models/comment.rb
Class Board < ActiveRecord::Base
    def all_comments
        ids = self.id + self.pictures.map(&:id)
        Comment.find(ids)
    end
end

Это найдет идентификаторы в модели comment, возвращая данные в виде коллекции. Если вам нужно истинное представление комментариев (иерархическое), вам придется использовать какую-то структуру ancestry/inheritance, я думаю

person Richard Peck    schedule 25.04.2014
comment
Нет, это не сработает, но интересная попытка. Он будет соответствовать идентификаторам из других моделей, которые также используют модель комментариев. - person JoshL; 25.04.2014