2013-03-09 2 views
1

У меня есть простое приложение с моделью пользователя, ролевой моделью, моделью сообщений с получателем. У пользователя много сообщений через роль , и у роли много сообщений через получателей, и у пользователя также много сообщений через получателей.Как объединить два запроса ActiveRecord в Rails

модели получатель имеет user_id, ROLE_ID и message_id

и теперь я хочу, чтобы отобразить все сообщения пользователя, включая его роль сообщения и его личное сообщение в одном запросе. Как я могу это сделать.

role model 

has_many :recipients 
has_many :received_messages, :class_name => 'Message', :order => 'created_at desc', through: :recipients 

user model 
has_many :roles 
has_many :received_messages, :class_name => 'Message', :order => 'created_at desc', through: :roles, :uniq => true 
has_many :recipients 
has_many :private_messages, :class_name => 'Message', :order => 'created_at desc', through: :recipients 

message model 
has_many :recipients 
has_many :roles, :through => :recipients 
has_many :users, :through => :recipients 

Со всем этим на месте, как я собираюсь принести пользователям сообщения как его ролевые сообщения и его личные сообщения

пример

def all_messages 
    @all_messages = current_user.#all messages scope here# 
end 
+0

У вас есть has_many: роли для пользовательской модели. это означает, что у вас есть правка own_to: пользователя на образце для подражания? – jvnill

ответ

2

один способ получить все сообщения является объединяя массив полученных_сообщений с массивом private_messages в методе all_messages. Это вернет массив всех сообщений пользователя.

def all_messages 
    (current_user.received_messages + current_user.private_messages).uniq 
end 
+0

Ницца. Спасибо, я никогда не знал о методе concat – Uchenna

+0

Я пробовал это, и я получил следующую ошибку: «Невозможно изменить ассоциацию« Пользователь # received_messages », потому что он проходит через несколько других ассоциаций.' – Uchenna

+0

Стреляйте, я не обратил на это внимания. Да, это имеет смысл, это не позволит вам изменить массив bc, созданный с помощью ассоциации ActiveRecord. Я просто обновил свой ответ для вас. –

Смежные вопросы