Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 获取当前用户和每个管理员之间的所有消息_Ruby On Rails_Rails Activerecord - Fatal编程技术网

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)