0

Rubyでデータ構造を構築する方法を理解しようと奮闘しています。

私の見解では、このように繰り返したいと思います

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

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

<% end %>

アクティブなレコード クエリからのメッセージ

@messages = Message.find_by_name('john')

メタはこのようなハッシュです

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

これを必要な @conversations オブジェクトに変換するにはどうすればよいですか?

4

2 に答える 2

1

私はそれをテストしませんでした。フィードバックを投稿してみてください。

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
于 2012-12-29T18:37:27.430 に答える
0
Conversation
 - subject : string

has_many :messages

Message
 - name : string

belongs_to :conversation

この行を変更します。

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

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

@conversationsはおそらくユーザーの会話から発生するため、Conversationをbelong_to:userにします。

于 2012-12-29T11:52:05.430 に答える