Ruby on rails 我如何在rails中构建一个数据结构,以便像这样迭代它
我正在努力想办法用ruby构建数据结构 在我看来,我希望像这样重复它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
<% @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)
结束
结束
#试验
@对话=[]
@对话我不知道你的意思。我正在寻找一种方法,可以使用模块或类来构建对象。数据库中不存在对话,因此它不能与任何内容相关。我建议您将其作为一个模型,并将其放在数据库中。不使用数据库也可以,但您计划如何识别哪些消息属于哪个对话?这一点很好,我将其抽象,因为这无关紧要。我只需要知道如何构建对话对象。谢谢!这正是我所需要的。在类中创建类对我来说是新事物。工作完美,我可以从这里修改。