Serialization Rails 3-从序列化数据构建表单

Serialization Rails 3-从序列化数据构建表单,serialization,ruby-on-rails-3.1,Serialization,Ruby On Rails 3.1,我一直在从事一个rails项目,我需要序列化用户角色的权限并存储在数据库中。就这一点而言,我很好。现在,当我想修改rails生成的表单中的序列化数据时,我的问题来了 我凭直觉行事,试着做出预期的行为。 这将是使用如下内容: f.check_box :permissions_customer_club_events_read class User::Affiliation::Role < ActiveRecord::Base attr_bucket :permissions =>

我一直在从事一个rails项目,我需要序列化用户角色的权限并存储在数据库中。就这一点而言,我很好。现在,当我想修改rails生成的表单中的序列化数据时,我的问题来了

我凭直觉行事,试着做出预期的行为。 这将是使用如下内容:

f.check_box :permissions_customer_club_events_read
class User::Affiliation::Role < ActiveRecord::Base
  attr_bucket :permissions => [:permissions_customer_club_events_read, :permissions_customer_club_events_write, :permission_do_crazy_things]

  after_initialize :init

  def init
    ## Sets base permission structure ##
    self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
  end
end
但是,由于不存在用于序列化数据的getter或setter,因此这不起作用(显然是:p)。现在我想知道我将如何着手解决这个问题,我唯一想到的是从我的序列化哈希动态生成getter和setter方法

例如:

def permissions_customer_club_events_read=(val)
  permissions[:customer][:club][:events][:read] = val
end

def permissions_customer_club_events_read
  permissions[:customer][:club][:events][:read]
end
有人明白我的意思吗

这是我的型号

class User::Affiliation::Role < ActiveRecord::Base
  require 'yajl'

  class YajlCoder
    def dump data
      Yajl.dump data
    end
    def load data
      return unless data
      Yajl.load data
    end
  end

  serialize :permissions, YajlCoder.new

  after_initialize :init

  def init
    ## Sets base permission structure ##
    self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
  end

end
class User::Affiliation::Role
我建议你看看类似的东西。表面上,这可以用来解决一些继承烦恼,但它也可以为您解决问题。这就是本质

看起来您知道所有权限是什么,但希望将所有权限序列化到同一数据库字段中。但在实际的rails应用程序中,您希望将所有权限视为完全独立的字段。这正是像
attr\u bucket
这样的解决方案可以让您做到的。让我们以您为例,您可以这样做:

f.check_box :permissions_customer_club_events_read
class User::Affiliation::Role < ActiveRecord::Base
  attr_bucket :permissions => [:permissions_customer_club_events_read, :permissions_customer_club_events_write, :permission_do_crazy_things]

  after_initialize :init

  def init
    ## Sets base permission structure ##
    self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
  end
end
class User::Affiliation::Role[:permissions\u customer\u club\u events\u read、:permissions\u customer\u club\u events\u write、:permissions\u do\u疯狂的事情]
初始化后:初始化
def初始化
##设置基本权限结构##
self.permissions | |=YAML.load_文件(“#{Rails.root}/config/permissions.yml”)
结束
结束
现在,您可以像使用单独的数据库字段一样使用
权限\u客户\u俱乐部\u事件\u读取
权限\u客户\u俱乐部\u事件\u写入
权限\u做疯狂的事情
,但是,当您实际保存对象时,所有这些字段都会“扣”在一起,并序列化到
:permissions
字段中


唯一需要注意的是序列化机制,我相信
attr_bucket
将使用YAML序列化所有内容,而您使用的是JSON。如果这不重要,那么你就是黄金,否则你可能需要修补
attr_bucket
以使用json而不是YAML,这应该是非常直接的。

如果我不理解这个问题,很抱歉;)

您可以在模型中包含一个customdata模块,并使用以下方法:

module CustomData
    def self.included(base)
        base.instance_eval do
        after_save        :save_data
    end

    def method_missing(method, *args, &block)
        if method.to_s =~ /^data_/
            data[method] ? data[method] : nil
        else
            super
        end
     end

      def data
          @data ||= begin
            #get and return your data
          end
      end

      private

      def save_data

      end
end
使用此方法,您必须使用
f。复选框:数据\u权限\u客户\u俱乐部\u事件\u读取

这并不完全,但我希望你能理解;) attr_bucket似乎也是一个很好的解决方案。

最终我解决了这个问题,我就是这样解决的。
现在为所有序列化字段生成getter和setter方法