Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我如何在rails中构建一个数据结构,以便像这样迭代它_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 我如何在rails中构建一个数据结构,以便像这样迭代它

Ruby on rails 我如何在rails中构建一个数据结构,以便像这样迭代它,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在努力想办法用ruby构建数据结构 在我看来,我希望像这样重复它 <% @conversations.each do |conversation| %> <%= "#{conversation.meta.subject} - #{conversation.meta.created_at} %> <% conversation.messages.each do |message| %> <%= message.nam

我正在努力想办法用ruby构建数据结构

在我看来,我希望像这样重复它

<% @conversations.each do |conversation| %>
    <%= "#{conversation.meta.subject} - #{conversation.meta.created_at} %>

    <% conversation.messages.each do |message| %>
         <%= message.name %>
    <% end %>

<% end %>
@meta = { 'subject ' => 'John Messages', 'created_at' => '2012-12-28 10:20:55.230286' }
Meta是这样的散列

<% @conversations.each do |conversation| %>
    <%= "#{conversation.meta.subject} - #{conversation.meta.created_at} %>

    <% conversation.messages.each do |message| %>
         <%= message.name %>
    <% end %>

<% end %>
@meta = { 'subject ' => 'John Messages', 'created_at' => '2012-12-28 10:20:55.230286' }
如何将其转换为我需要的@conversations对象

Conversation
 - subject : string

has_many :messages

Message
 - name : string

belongs_to :conversation
更改此行:

<%= "#{conversation.meta.subject} - #{conversation.meta.created_at} %>


@对话可能来自用户的对话,所以让对话属于:user

我没有测试它。尝试并发布反馈

class Conversation
  attr_reader :name

  class Meta
    attr_accessor :subject, :created_at
    def initialize(attributes = {})
      attributes.each do |key, value|
        send("#{key}=", value)
      end
    end
  end

  def initialize(name)
    @name = name
    messages # preload
  end

  def messages
    @messages ||= Message.where(:name => name).order("created_at") # .find_by_name returns a single object, but you waiting for an Array, so use .where
  end

  def default_meta_attributes
    {:subject => "#{name} Messages", :created_at => messages.last.created_at}
  end

  def meta(attrs={})
    @meta ||= Meta.new(attrs.blank? ? default_meta_attributes : attrs)
  end

end

# test

@conversations = []
@conversations << Conversation.new("John")

@conversations.each do |conversation|
  puts conversation.meta.subject
  puts conversation.meta.created_at
  puts "Now conversation messages of #{conversation.name}"
  conversation.messages.each do |message|
    puts message.name
  end
end
课堂对话
属性读取器:名称
类元
属性访问器:主题:已创建
def初始化(属性={})
属性。每个do |键、值|
发送(“#{key}=”,值)
结束
结束
结束
def初始化(名称)
@name=name
消息#预加载
结束
def消息
@messages | |=Message.where(:name=>name).order(“created_at”)#。find_by_name返回单个对象,但您正在等待数组,因此请使用.where
结束
def default_meta_属性
{:subject=>“{name}Messages”,:created_at=>Messages.last.created_at}
结束
def meta(attrs={})
@meta | |=meta.new(attrs.blank??默认的meta属性:attrs)
结束
结束
#试验
@对话=[]

@对话我不知道你的意思。我正在寻找一种方法,可以使用模块或类来构建对象。数据库中不存在对话,因此它不能与任何内容相关。我建议您将其作为一个模型,并将其放在数据库中。不使用数据库也可以,但您计划如何识别哪些消息属于哪个对话?这一点很好,我将其抽象,因为这无关紧要。我只需要知道如何构建对话对象。谢谢!这正是我所需要的。在类中创建类对我来说是新事物。工作完美,我可以从这里修改。