ruby-on-rails - rails : Passing Variables from a Class Method to an Instance Method

标签 ruby-on-rails variables methods

我有几个模型有共同的担忧。每个模型都会传递一个哈希值,这旨在处理它们使用关注点的方式上的细微差异。我通过类方法传递哈希值,如下所示:

add_update_to :group, :user

该问题的完整代码是:

module Updateable
  extend ActiveSupport::Concern

  attr_accessor :streams

  module ClassMethods
    def add_updates_to(*streams)
      @streams = streams
    end
  end

  module InstanceMethods
    def update_streams
      @streams.collect{|stream| self.public_send(stream)}
    end
  end

  included do
    has_one :update, :as => :updatable

    after_create :create_update_and_history
  end

  private
    def create_update_and_history
      update = self.create_update(:user_id => User.current.id)
      self.update_streams.each do |stream|
        stream.histories.create(:update_id => update.id)
      end
    end
end

大部分代码都有效,但我在将哈希从类传递到实例时遇到问题。目前,我正在尝试通过创建一个虚拟属性,将哈希值传递给该属性,然后在实例中检索它来实现此效果。这不仅让人感觉很麻烦,而且不起作用。我假设它不起作用,因为 @streams 是一个实例变量,因此类方法 add_update_to 无法实际设置它?

无论如何,有没有更好的方法来解决这个问题?

最佳答案

您可能可以在这里使用类变量,但由于其不可预测的性质,这些变量在 Ruby 社区中受到了相当多的批评。要记住的是,Ruby 中的类实际上也是类的实例,并且可以拥有自己的实例变量,这些变量只能由它们自己访问,而不能由它们的实例访问(如果有任何明确的说明的话)。

在这种情况下,您定义的是行为,而不是数据,所以我认为实例变量和类变量都不合适。相反,我认为最好的选择是直接在类方法中定义实例方法,如下所示:

module Updateable
  extend ActiveSupport::Concern

  module ClassMethods
    def add_updates_to(*streams)
      define_method :update_streams do
        streams.collect {|stream| public_send(stream) }
      end
    end
  end
end

顺便说一句,这里没有涉及哈希,所以我不确定你指的是什么。 *streams 将您的参数收集到一个数组中。

关于ruby-on-rails - rails : Passing Variables from a Class Method to an Instance Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15538325/

相关文章:

ruby-on-rails - 如何从 created_at 列中仅提取年份

ruby-on-rails - 缺少 `secret_token` 和 `secret_key_base` - Rails 4.2.0 with RVM

mysql - Rails activerecord 查找具有特定子关联的对象

c - 什么是 C 中的标量变量?

c# - 将 LINQ 订单查询抽象为多级排序函数

java - Java 接口(interface)的包装方法实现

ruby-on-rails - PostgreSQL 但不是 SQLite 的 ActiveRecord 错误 - GroupingError - 列必须出现在 GROUP BY 子句中或用于聚合函数

php - 为什么包含我的凭据的变量没有插入到 PDO 连接中?

python - 获取文本 Python 之间的字符串

algorithm - 设置值使用逻辑