Ruby将变量添加到现有对象?

时间:2018-06-14 20:28:12

标签: ruby-on-rails ruby variables attributes ruby-on-rails-5

如何将变量添加到现有的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属性。

我想知道我是否可以使用对象执行此类操作,只需添加一个临时变量以在索引页面中使用。

3 个答案:

答案 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