Ruby on rails查询问题

时间:2016-06-20 21:40:41

标签: ruby-on-rails ruby ruby-on-rails-4

我正在rails4上开发Web应用程序。

我有用户,阻止和请求表。 Block有blocker_id和blocked_id。 有些用户有请求,有些用户可以阻止其他用户。

我希望得到一些由某个用户创建的请求实体,而不是阻止其他用户。

假设有一个由u1创建的r1。 如果u2没有阻挡u1,u2想得到r1。

喜欢Request.where(" requests.user_id未被u2&#34阻止;)

1 个答案:

答案 0 :(得分:0)

如果不知道为3个模型设置的关系,那么给出完整的响应有点困难。以下是一种情况。

您正在尝试确定是否显示来自用户的请求。 这取决于登录的用户(允许他们称呼current_user)是否阻止了请求用户(让我们称呼他们requestor)。可以在“已阻止”表中找到被阻止的用户。

您可以先查询阻止表,看看用户是否已被阻止:

Block.find_by(blocked_id: requestor.id, blocker_id: current_user.id)

如果找到一个Block对象,则返回一个Block对象,否则返回nil。将其设置为变量现在将为用户提供阻止状态。可能是控制器动作中的最佳设置。

class RequestsController << ApplicationController

  def show
    @blocked_status = Block.find_by(blocked_id: requestor.id, blocker_id: current_user.id)
    @request = Request.find_by(request_from_id: requestor.id, request_to_id: current_user.id)
  end
end

然后,您可以在视图中使用该信息来显示请求

requests.html.erb

中的

<% unless @blocked_status %>
   # html to display request from requestor to current_user
<% end %>

使用范围来查找请求,例如:

scope :not_blocked_by, -> (user_id) {
   joins("JOIN `blocks` b ON b.`blocked_id` = `requests`.`request_from_id` AND b.`blocker_id` = #{current_user.id}")
   .where.not('b.blocked_id = :user_id', user_id: user_id)
}

然后在控制器中。

class RequestsController << ApplicationController

  def show
    @request = Request.not_blocked_by(@requestor.id)
  end
end