Ruby on rails 获取当前用户和每个管理员之间的所有消息
我有型号Ruby on rails 获取当前用户和每个管理员之间的所有消息,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我有型号用户 class User < ActiveRecord::Base has_many :sent_messages, class_name: 'DirectMessage', foreign_key: :sender_user_id has_many :received_messages, class_name: 'DirectMessage', foreign_key: :receiver_user_id end 我需要编写查询以获取所有消息,其中: sender\u
用户
class User < ActiveRecord::Base
has_many :sent_messages, class_name: 'DirectMessage', foreign_key: :sender_user_id
has_many :received_messages, class_name: 'DirectMessage', foreign_key: :receiver_user_id
end
我需要编写查询以获取所有消息,其中:
sender\u user\u id=options[:current\u user]。id和receiver\u user.role='admin'
或receiver\u user\u id=options[:current\u user]。id和sender\u user.role='admin'
我只需要获得当前用户和每个管理员之间的所有消息
现在,我正在尝试这样的事情:
DirectMessage.all.joins(:sender_user, :receiver_user).where('(sender_user_id = ? AND sender_user.role = ?) OR ( receiver_user_id = ? AND receiver_user.role = ?)', options[:current_user].id, 'admin', options[:current_user].id, 'admin')
DirectMessage.all.where('(sender_user_id = :current_user_id AND receiver_user_id IN (:admin_ids)) OR (sender_user_id IN (:admin_ids) AND receiver_user_id = :current_user_id)',
current_user_id: options[:current_user].id, admin_ids: User.admin.ids)
但它只返回我
。如果我尝试从中获取第一条记录,我将得到错误:
***ActiveRecord::Statement无效异常:PG::UndefinedTable:错误:表“发件人\用户”第1行的子句条目中缺少:
…r_id='b4de3f59-b234-459a-adb1-2a6c1a135919'和发送方使用
请帮我写一个合适的查询。谢谢。您需要创建一个方法,将当前用户值传递给您的模型,当前用户在模型中不可用,仅在视图和控制器中可用。 注意:您可以将这些方法定义为作用域或方法
class DirectMessage < ApplicationRecord
...
def self.messages_from_user(user)
where(sender_user: user, receiver_user: User.admins)
end
end
class User < ApplicationRecord
...
def self.admins
where(role: 'admin')
end
end
# then in your controller or view you can do
@direct_messages = DirectMessage.messages_from_user(current_user)
class DirectMessage
我找到了一个有效的解决方案。首先,我们需要为用户
模型添加范围:
class User < ActiveRecord::Base
has_many :sent_messages, class_name: 'DirectMessage', foreign_key: :sender_user_id
has_many :received_messages, class_name: 'DirectMessage', foreign_key: :receiver_user_id
scope :admin, -> { where(role: 'admin') }
end
我不认为会有几十个以上的管理员,所以这个解决方案相当不错。在这种情况下,我不会收到来自管理员的传入消息,只会收到传出消息。看看我的答案,我找到了一个有效的解决方案。是的,你是在我给你的答案的基础上建立起来的。不,你的方式不能按需要工作,它只向任何管理员发送当前用户发出的消息。我的解决方案将当前用户发出的所有消息提供给任何管理员,并将任何管理员发出的所有传入消息提供给当前用户。下次请仔细阅读这个问题。stackoverflow的目的是帮助人们解决技术问题,而不是把他们完成的工作交给他们。我向您展示了如何使用作用域“注意:您可以将这些方法定义为作用域或方法”。我还向您介绍了该方法
def self.admins where(role:'admin')end
Lol为什么用别人提供的答案回答自己的问题?你在这里也做了同样的事:相当跛脚……@SickLickWill,不要像个小男孩一样生气。你的答案不符合需要。通过你的链接我的答案是我自己写的,但根据用户的评论进行了更新,表明了他的作者身份。你是一个笑话。)
DirectMessage.all.where('(sender_user_id = :current_user_id AND receiver_user_id IN (:admin_ids)) OR (sender_user_id IN (:admin_ids) AND receiver_user_id = :current_user_id)',
current_user_id: options[:current_user].id, admin_ids: User.admin.ids)