如何将变量添加到现有的obejct? 我有一个聊天室列表,我想在我的视图中为每个聊天添加一个新变量:
示例我想添加聊天的总用户
def index
chats_all = ChatRoom.all
@chats = Array.new
chats_all.each |chat|
chat.total_users = 10
@chats << chat
end
@chats
end
total_users不是ChatRoom类的属性。
[编辑 - @jvillian awnser后更好地解释]
我不想将total_users作为User类的属性。
我只想添加一个变量来使用这一页。对于json rails已经允许我向对象添加新属性。只需要使用as_json()。map和merge()
例如:
def index
chats = chats.as_json().map {
|chat|
chat.merge(
total_users: 10
}
response = { chats: chats }
render json: response
end
现在我有一个带聊天的json,每个聊天都有total_users属性。
我想知道我是否可以使用对象执行此类操作,只需添加一个临时变量以在索引页面中使用。
答案 0 :(得分:2)
尝试
class ChatRoom < ActiveRecord::Base
attr_accessor :total_users
end
您可以在docs中阅读更多内容。
然后,索引可能看起来像:
def index
@chats = ChatRoom.all.map do |chat|
chat.total_users = 10
chat
end
end
或者,我很想做类似的事情:
class ChatRoom < ActiveRecord::Base
TOTAL_USERS = 10
attr_accessor :total_users
def total_users
@total_users || TOTAL_USERS
end
end
然后:
def index
@chats = ChatRoom.all
end
现在,你得到
@chats.first.total_users
=> 10
如果您愿意,可以将total_users
设置为其他内容,但默认为10。
这是使用OpenStruct的潜在方法:
def index
@chats = ChatRoom.all.map do |chat|
OpenStruct.new(
chat.
attributes.
merge!(total_users: 10)
)
end
end
现在,你可以这样做:
@chats.each do |chat|
puts chat.total_users
end
将返回10
。
BTW和TBH,我做了类似的事情(使用OpenStruct或自定义装饰器)一直。在我最近的应用中,视图从不可以直接访问模型。
答案 1 :(得分:0)
也许您想将响应作为数组发送到视图并扫描以显示信息?
def index
@chats = ChatRoom.all.as_json().map { |chat| chat.merge("total_users" => 10) }
end
然后访问@chats
,实际上是一个哈希数组,查看:
<% @chats.each do |chat| %>
<p><%= chat["total_users"] %></p>
<% end %>
您可以@chats
<p><%= @chats %></p>
的结构
我可能会犯一些语法错误。
答案 2 :(得分:0)
创建临时自定义对象而不向数据库Struct添加新属性可以解决我的问题。
我可以使用聊天室信息和总用户数创建一个Struct
chat_info = Struct.new(:name, :total_users, :messages)
chat_temp = []
chats = ChatRoom.where(condition)
chats.each do |chat|
chat_temp << chat_info.new("nome", 100, messages)
end