Поиск данных в Rails - PullRequest
       20

Поиск данных в Rails

0 голосов
/ 25 августа 2009

У меня есть 3 модели, Пользователь, Пост, Комментарий с определением, как показано ниже

    class Post < ActiveRecord::Base
      belongs_to :user
      has_many :comments
      def self.find_other_user_posts
           ?
      end
    end
    class User < ActiveRecord::Base
      has_many :posts
      has_many :comments
      has_many :posts_commented_on, :through => :comments, :source => :posts
    end
    class Comment< ActiveRecord::Base
      belongs_to :post
      belongs_to :user
    end

Пользователь может иметь много постов и много комментариев, вопрос в том, что я хочу сделать метод в модели постов, который возвращает коллекцию постов. Метод найдет посты и комментарии, которые не принадлежат текущему пользователю. Например, есть

Post: A have Comment: A1
Post: B have Comment: B1, B2, B3, B4
Post: C have Comment: C1, C2
Post: D have Comment: nil
Post: E have Comment: nil
Post: F have Comment: F1, F2, F3

у текущего пользователя собственные сообщения A, E и комментарий A1, B2, так что звоните:

@posts = Post.find_other_user_posts

вернет коллекцию сообщений C, D, F.

Спасибо

@ Терри, после вашего решения мне удалось добавить

@posts = Post.find( :all,
    :include => [:comments],
    :conditions => ["posts.user_id <> ? and (comments.user_id <> ? or comments.user_id is null)", current_user, current_user])

И, например, такие данные, как ниже Pn для записи Cn для комментария Un для пользователя, и я показываю пример данных в форме объединения

Post,Post Owner,Comment, Comment Owner
P1,U1,C1,U2
P1,U1,C2,U2
P1,U1,C3,U2
P1,U1,C4,U3 *
P1,U1,C5,U4 *
P1,U1,C6,U5 *
P2,U1
P3,U2
P4,U3,C7,U2
P4,U3,C8,U2
P5,U4

P2, P3, P5 не имеют комментариев и предполагают, что current_user - это U2, пост, который я хочу собрать, - это P2 и P5, потому что U2 делает комментарий к P1 и P4, а U2 - владелец P3, так что осталось это P2 и P5.

Но с приведенным выше кодом возвращаются P1, P2 и P5, корректно для P2 и P5, но как насчет P1?

Почему возвращается P1? и когда я рисую его шаг за шагом, я понимаю, что строка со звездочкой (*) является проблемой, потому что эти три строки - ИСТИНА для трех условий, которые я применяю в коде ... и поэтому я сейчас растерялся , в любом случае, чтобы исправить код с помощью всего 1 вызов SQL?

Ответы [ 2 ]

5 голосов
/ 26 августа 2009
@posts = Post.find(:all,
           :include => [:comments],
           :conditions => ["posts.user_id <> ? and comments.user_id <> ?",
                           user.id,
                           user.id])

Обратите внимание, что здесь "пользователь" не является ассоциированным пользователем модели Post. Изучите использование named_scopes для реализации этого поведения.

2 голосов
/ 26 августа 2009

Я хочу попробовать другой подход:

 @posts = Post.find_all - current_user.posts - current_user.comments.map(&:posts)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...