У меня есть 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?