我正在rails4上开发Web应用程序。
我有用户,阻止和请求表。 Block有blocker_id和blocked_id。 有些用户有请求,有些用户可以阻止其他用户。
我希望得到一些由某个用户创建的请求实体,而不是阻止其他用户。
假设有一个由u1创建的r1。 如果u2没有阻挡u1,u2想得到r1。
喜欢Request.where(" requests.user_id未被u2&#34阻止;)
答案 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