【问题标题】:Dynamically added hash properties to Rails Model instance object?向 Rails 模型实例对象动态添加哈希属性?
【发布时间】:2012-09-20 20:05:45
【问题描述】:

有一个模型

class PlaylistModel < ActiveRecord::Base
    /* code */
end

然后在控制器动作中有这样的代码

PlaylistController < ActionController::Base
  def a_action
    @item = Playlist.find(10)
    @item[:visited] = true     
  end
end

但是,PlaylistModel(或播放列表表的模式)中没有定义visited 属性!看起来一个新属性正在动态添加到对象中。这是正在发生的事情吗?所有这些功能在哪里定义/我可以在哪里阅读更多相关信息。

感谢您的帮助!

【问题讨论】:

  • 有趣,您似乎可以通过说@item[:visited]=true 添加属性,但是当您键入@item.inspect 时,[:visited]=true 属性未列出。 .. 但显然可以通过键入 @item[:visited] 访问
  • 当您检查模型时,属性编写器不一定会公开所有属性。它仅公开可通过attr_accessorattr_reader 等访问的已定义列名和属性。请参阅我在下面发布的链接。

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.1


【解决方案1】:

这是here 解释的属性设置器快捷方式。它几乎等同于:

@item.attributes[:visited] = true

【讨论】:

  • 所以我写的并不是真正的用途。因为它旨在用于写入 ActiveRecord/dB 模式中定义的属性,但它仍然有效。当您执行 @project.save 时,它不会保存到数据库中
  • 正确,如果没有支持该属性的数据库列,则仅当对象在内存中时它才会持续存在。
【解决方案2】:

我认为您正在寻找的是虚拟属性...可以在模型中定义http://railscasts.com/episodes/16-virtual-attributes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多