Rails - 如何让两个用户 ID 与模型相关联
Posted
技术标签:
【中文标题】Rails - 如何让两个用户 ID 与模型相关联【英文标题】:Rails - How to have two user id's associated with model 【发布时间】:2015-03-30 19:30:23 【问题描述】:我使用 devise 作为我的身份验证框架。我有一个属于_to:user的报告模型和一个has_many:reports的用户模型。当我将报告状态设置/相同为“关闭”时,我想将当前用户保存为“关闭”报告的用户,该用户可能不是创建报告的用户。因此,我在报告调制解调器中添加了另一列,名为 closed_by_user_id:integer:index。我不确定如何使用标准模型用户关联来实现这一点。所以我添加了一些代码来在“关闭”报告时将 current_user 保存到记录中。然后这会显示在表格中。然后我想显示创建报告的用户(它使用魔术设计助手自动执行)和我想显示“关闭”报告的用户。这不会自动工作,或者至少我不知道该怎么做。因此,我尝试在关闭/保存报告的索引视图迭代报告时使用当前用户在用户模型上调用 find 方法。我得到一个 ActiveRecord Relation 和一个 true 值。 rails 控制台中的查询我确实得到了正确的记录,但是 puts u.name 输出“用户”。不知道从这里去哪里。以前玩过这个更复杂场景的人有什么想法吗?我非常感谢有关这方面的教育。谢谢
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :timeoutable
has_many :reports
end
class Report < ActiveRecord::Base
belongs_to :user
end
2.2.1 :011 > u = User.where(id: 2)
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2
=> #<ActiveRecord::Relation [#<User id: 2, name: "Test User", username: "tuser", email: "testuser@mail.com", encrypted_password: "$2a$10$BuPxu4JKZeVSK2AR6DaNT.KthntX0lb3SmAFq5I5mID...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-03-30 19:04:10", last_sign_in_at: "2015-03-30 19:04:10", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", failed_attempts: 0, unlock_token: nil, locked_at: nil, created_at: "2015-03-30 19:04:09", updated_at: "2015-03-30 19:04:10">]>
2.2.1 :012 > u.name
=> "User"
2.2.1 :013 >
【问题讨论】:
【参考方案1】:在报告中,有一个 closed
列,默认情况下布尔值设置为 false,报告表中有一个 closed_by
列,它是一个整数。
在显示视图中,有一个用于提交表单的“关闭”按钮。封闭形式将具有隐藏字段,例如。
f.hidden_field :closed_by, val: current_user.id
f.hidden_field :closed, val: true
这可以在控制器中运行一个动作来更新报告属性,例如。
update(report_params)
现在关闭的布尔值设置为 true,您可以通过查找 ID 最终出现在该列中的用户的 ID 来调用用户 ID。在报告控制器中,您会找到用户并将其分配给实例变量。
@closer = User.find(params[:closed_by])
这将检查 closed_by 列检索整数,然后通过 ID 查找用户。
现在,在您的显示视图中,您可以调用用户属性。例如,如果您的用户有名字,您可以调用:
<%= @closer.name %>
您还可以在视图中使用布尔值来显示您的“关闭”文本。例如:
<% if report.closed == true %>
<p>Report Closed</p>
<% end %>
【讨论】:
您好,感谢您的快速回复!让我稍微消化一下。我在报告表中已经有一列设置为“已关闭”(:状态)。以及关闭时确实设置的列 closed_by_user_id。但也许你的方法更干净。我也考虑过在控制器中查找,但我试图列出更接近我将显示许多报告的索引操作。 因为关闭帖子的用户可能不拥有它,这可能会变得有点棘手。您可以通过在循环内运行find_by(params[:closed_by])
方法来做到这一点,但如果页面上有很多,则可能会导致进行许多不必要的搜索。因此,您可以将其包装在 if 语句中,以便仅检索已关闭的信息。 if status == closed
我想我在同一条轨道上,但这就是我在视图中获得返回值 true 并在控制台中获得“用户”的地方。
abbott567 - 我采取了不同的路线,也许不是最干净的。我没有跳过很多麻烦,而是在报告视图中添加了一个帮助器,传递了 report.closed_by_user_id。在辅助方法中,我为用户查找用户模型。我在索引视图上有 will_paginate,所以查询量很小。非常感谢您的关注!!就像你说的,这是一个棘手的问题。我不想让它变得比它必须的更难以上是关于Rails - 如何让两个用户 ID 与模型相关联的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 中使用 Cloudinary 将直接上传字段与模型相关联?
在 Rails 中使用 user_id:integer 与 user:references 生成模型
Rails 6:通过网络抓取控制器操作创建帖子时如何将用户与创建的帖子相关联