简体   繁体   English

如何在Rails中构建数据结构,以便可以像这样遍历它

[英]How do I build a data structure in rails so that I can iterate through it like this

I'm struggling to try and figure out how to build a data structure in ruby. 我正在努力尝试找出如何在ruby中构建数据结构。

In my view I wish to iterate through it like this 在我看来,我希望这样迭代

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

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

<% end %>

Messages come from an active record query 消息来自活动记录查询

@messages = Message.find_by_name('john')

Meta is a hash like this 元是这样的哈希

@meta = { 'subject ' => 'John Messages', 'created_at' => '2012-12-28 10:20:55.230286' }

How do I turn this into the @conversations object I need? 如何将其转换为所需的@conversations对象?

I didn't test it. 我没有测试。 Try and post feedback. 尝试发布反馈。

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
Conversation
 - subject : string

has_many :messages

Message
 - name : string

belongs_to :conversation

Change this line: 更改此行:

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

to

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

@conversations would probably come from a user's conversation, so make Conversation belong_to :user @conversations可能来自用户的对话,因此将Conversation归属为:user

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何遍历Rails中的Associations? - How do I iterate through Associations in Rails? 如何在Rails中构造控制器,以便可以在表单提交上创建多个模型? - How do I structure my controller in Rails so that I can create multiple models on form submit? Ruby on Rails 4-如何遍历这些参数? - Ruby on Rails 4 - How do I iterate through these params? 如何在Rails View中遍历Alchemy CMS元素? - How can I iterate through Alchemy CMS elements in Rails View? 如何遍历我的rails应用程序中的所有模型? - How can I iterate through all of the Models in my rails app? 如何在rails视图中迭代数组? - How can I iterate through an array in rails view? 如何为我的 Rails 应用程序构建 API,以便多个站点可以共享一个数据库? - How do I build an API for my Rails app, so that multiple sites can share one database? 如何在Rails中引发异常,使其表现得与其他Rails异常一样? - How do I raise an exception in Rails so it behaves like other Rails exceptions? 如何迭代这个Ruby代码,以便我可以在地图上动态显示标记? - How do I iterate over this Ruby code so that I can dynamically show markers on a map? Rails:创建新条目时如何遍历模型中的嵌套属性 - Rails: How do I iterate through nested attributes in model when creating new entries
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM