论文名称:DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks
论文地址:https://arxiv.org/abs/1704.04110
论文作者:亚马逊
论文年份:2017
论文被引:558(2022/3/23)
几个比较好的资源:
什么是概率预测,如图所示:

source:图片来源
即不光要预测未来这条曲线(具体的预测值),还要预测这条曲线的分布情况,以用来评估预测值的风险。

图1是论文中的双对数直方图(图中的曲线称为幂律函数,power-low,
y
=
x
a
y=x^a
y=xa),该函数是用来观察多条单独的时间序列数据是否存在长尾分布。正常情况下,满足该函数的数据呈正态分布,反映在双对数直方图中是一条从左上角到右下角的直线。图1中右下角的曲线说明多条时间序列曲线存在长尾分布,即各个商品的销量是不一样的。
这种长尾分布对于模型的影响是巨大的,比如一个数据集中,大部分都是长尾分布(scale小,比如100)的的时间序列数据,就会导致模型的预测值偏向于长尾分布,而原来非长尾分布(scale大,比如1000)的时间序列将会受到影响,会出现明显的欠拟合,最后导致模型学习失败。
对于这种尺度不一致的时间序列数据,通常的处理方式使用标准化,将数据统一到同一个scale。在模型中,也可以通过Batch Normalization 层进行batch的标准化,但是在图1这样的数据中不是很有效。
协变量(covariates)是指时间序列数据相关的特征,比如如果是预测某一商品的销量(sales),数据集中肯定还有其它的特征列,比如星期几,商品的种类,颜色等等,这些与被预测变量相关的特征列称为协变量。具体的解释在论文3.4部分中提到了。
参考:https://zhuanlan.zhihu.com/p/348889806
时间序列的个数
在解决时序预测问题时,需要根据问题的描述精细定位。对于一元时间序列,可能经典的ARIMA就能解决问题。当然了,这个划分也不是绝对的,因为一元时间序列通过提取时间相关的特征,转换为多元时间序列。这时候传统的回归算法都可适用,比如Lightgbm。
既然有了Lightgbm,为什么还要DeepAR呢?
如果说Lightgbm是中国厨师手里的菜刀,大厨用的好的话(预处理和特征工程),雕花也没问题,但前提是大厨。DeepAR更像是德国厨师的刀具组,各司其职,术业专攻,普通人也能通过选择合适的刀具也来快速展示厨艺。
DeepAR 就是专门针对多重时间序列(单)多元(单)多步预测问题的算法。
其中DeepAR要解决问题的痛点是:多重时间序列。比如商品销售预测问题,试想一下电商十多个大类,上千个小类,上百万个商品,难道我们需要建立上百万个模型吗?如果是新品,没有训练数据怎么办(冷启动问题)?
DeepAR的核心是用循环神经网络(RNN)预测多重时间序列。相比于一般的RNN算法,有三点优势:
【研究意义】
预测在大多数企业的运营流程自动化和优化方面发挥着关键作用,并支持数据驱动的决策制定。例如,在零售业,产品供需的概率预测可用于优化库存管理、人员调度和拓扑规划 [18],并且更普遍地是供应链优化大多数方面的关键技术。
当今使用的流行预测方法是在预测单个或小组时间序列的设置中开发的。在这种方法中,每个给定时间序列的模型参数都是从过去的观察中独立估计的。该模型通常是手动选择的,以考虑不同的因素,例如自相关结构、趋势、季节性和其他解释变量。然后,拟合模型用于根据模型动力学预测未来的时间序列,可能通过模拟或预测分布的封闭形式表达式允许概率预测。此类中的许多方法都基于经典的 Box-Jenkins 方法 [3]、指数平滑技术或状态空间模型 [11、19]。
近年来,一种新型的预测问题在许多应用中变得越来越重要。无需预测单个或少数时间序列,而是面临预测数千或数百万个相关时间序列。示例包括预测单个家庭的能源消耗、预测数据中心服务器的负载或预测大型零售商提供的所有产品的需求。在所有这些场景中,可以利用关于类似的相关时间序列过去行为的大量数据来对单个时间序列进行预测。使用来自相关时间序列的数据不仅可以在不过拟合的情况下拟合更复杂(因此可能更准确)的模型,还可以减轻经典技术所需的时间和劳动密集型手动特征工程和模型选择步骤。
在这项工作中,我们提出了 DeepAR,一种基于自回归循环网络的预测方法,它从数据集中所有时间序列的历史数据中学习这样一个全局模型。我们的方法建立在之前对时间序列数据进行深度学习的工作 [9,21,22] 的基础上,并针对概率预测问题定制了一个类似的基于 LSTM 的循环神经网络架构。
在现实世界的预测问题中尝试从多个时间序列中联合学习的一个挑战是时间序列的量级差异很大,并且量级的分布严重偏斜。这个问题如图 1 所示,该图显示了亚马逊销售的数百万件商品的销售速度(即商品的平均每周销售额)分布。分布超过几个数量级的近似幂律。据我们所知,这一观察是新的(尽管可能并不令人惊讶),并且对试图从此类数据集中学习全局模型的预测方法具有根本意义。分布的无标度特性使得很难将数据集划分为具有特定速度带的时间序列子组并为它们学习单独的模型,因为每个这样的速度子组都会有类似的偏斜。此外,基于组的正则化方案,例如 Chapados [4] 提出的方案,可能会失败,因为每个组内的速度将大不相同。最后,这种偏斜分布使某些常用的归一化技术(例如输入标准化或批量归一化 [14])的使用效果降低。
这篇论文的主要贡献有两个:
除了提供比以前的方法更好的预测精度外,我们的方法与经典方法和其他全局方法相比还具有许多关键优势:
由于预测的巨大实际重要性,已经开发了多种不同的预测方法。预测单个时间序列的方法的突出示例包括 ARIMA 模型 [3] 和指数平滑方法;Hyndman et al. [11] 提供了对这些和相关技术的统一评论。
特别是在需求预测领域,人们经常面临高度不稳定、间歇性或突发性的数据,这些数据违反了许多经典技术的核心假设,例如高斯误差、平稳性或时间序列的同方差性。由于数据预处理方法(例如 [2])通常不能缓解这些情况,因此预测方法还结合了更合适的似然函数,例如零膨胀泊松分布、负二项式分布 [20]、两者的组合 [4 ],或定制的多阶段似然[19]。
跨时间序列共享信息可以提高预测准确性,但在实践中很难实现,因为数据通常具有异构性。矩阵分解方法(例如 Yu 等人最近的工作 [23])以及**通过分层先验共享信息的贝叶斯方法[4]**已被提议作为跨多个相关时间序列学习和利用分层结构的机制[13]。
神经网络已经在预测的背景下进行了很长时间的研究(参见例如调查中的众多参考文献 [24],或 [7] 以了解考虑 LSTM 的最新工作)。最近,Kourentzes [17] 专门将神经网络应用于间歇性数据,但结果好坏参半。预测中的神经网络通常应用于单个时间序列,即不同的模型独立地拟合到每个时间序列 [15,8,6]。另一方面,在预测社区之外,基于循环神经网络的时间序列模型已经非常成功地应用于其他应用,例如自然语言处理 [9, 21]、音频建模 [22] 或图像生成 [10]。
两个主要特征使我们在这里考虑的预测设置有所不同:

调节范围
z
i
,
1
:
t
0
−
1
z_{i,1:t_0-1}
zi,1:t0−1 中的观测信息通过初始状态
h
i
,
t
0
−
1
h_{i,t_0-1}
hi,t0−1 传递到预测范围。在序列到序列设置中,这个初始状态是编码器网络的输出。虽然通常这个编码器网络可以有不同的架构,但在我们的实验中,我们选择在调节范围和预测范围内为模型使用相同的架构(对应于序列到序列模型中的编码器和解码器)。此外,我们在它们之间共享权重,以便解码器
h
i
,
t
0
−
1
h_{i,t_0-1}
hi,t0−1 通过 (1) 计算获得
t
=
{
1
,
.
.
.
,
t
0
−
1
}
t = \{1,..., t_{0 - 1} \}
t={1,...,t0−1} 处的初始状态,协变量是在所有时刻(past 和 future)模型都可以看到的。编码器 hi,0 和 zi,0 的初始状态被初始化为零。

DeepAR模型架构:

DeepAR模型为seq2seq结构,编码器和解码器部分使用相同的网络结构,并且共享权重。
作者认为似然 l ( z ∣ θ ) l(z|θ) l(z∣θ) 决定了“噪声模型”,应该选择与数据的统计特性相匹配。DeepAR直接预测下一个时间点的概率分布的所有参数 θ(例如均值和方差)。
论文中有两种选择,针对连续型数据(real-valued data,比如温度)的高斯似然和针对正计数数据(positive count data,比如销量)的负二项似然(negative-binomial likehood,负二项分布)。负二项分布与二项分布类似,都是基于N重伯努利实验,比如抛100次硬币,正面的概率是多少。泊松分布描述的是单位时间内随机事件发生的次数,理论上泊松分布更适合处理positive count data。但是泊松分布假设均值等于方差,这在真实环境中的数据不一定成立,而负二项分布可以解决这问题。也可以使用其他似然模型,例如单位区间中数据的 beta 似然,二元数据的伯努利似然,或者混合以处理复杂的边际分布,只要能容易地获得分布中的样本,对数似然及其关于可评估参数的梯度。
我们使用其均值和标准差
θ
=
(
µ
,
σ
)
θ = (µ, σ)
θ=(µ,σ) 对高斯似然进行参数化,其中均值由网络输出的仿射函数给出,为了确保
σ
>
0
σ > 0
σ>0,标准差通过应用仿射变换和 softplus 激活函数获得:

为什么不使用ReLU激活函数,二者的对比如下图所示。softplus激活函数在负值区间内更加平滑,这样的平滑操作在求解方差时,认为方差是个缓慢的增加的过程。而ReLU直接置零,导致方差为零。

source:图片来源
模型参数可以通过最大化对数似然来学习,使用随机梯度下降求解。

需要注意,对于所有训练示例,保持总长度
T
T
T 以及条件和预测范围的相对长度固定。用零填充未观察到的目标值。这允许模型在考虑所有其他可用特征的情况下学习“新”时间序列的行为。通过使用这个窗口化过程来扩充数据,确保关于绝对时间的信息只能通过协变量提供给模型,而不是通过时间序列中
z
i
,
t
z_{i,t}
zi,t 的相对位置。
[1] 指出,由于此类模型的自回归性质,优化 (2) 直接导致模型在训练期间的使用方式与从模型获得预测时的差异:在训练期间, z i , t z_{i,t} zi,t 的值是已知的在预测范围内,可用于计算 hi,t;然而,在预测过程中,对于 t ≥ t0, z i , t z_{i,t} zi,t 是未知的,并且模型分布中的单个样本 〜zi,t ∼ l(·|θ(hi,t)) 用于根据 (1) 计算 hi,t。虽然已经表明这种断开连接会造成严重的问题,例如NLP 任务,我们在预测设置中没有观察到由此产生的不利影响。计划采样变体的初步实验 [1] 没有显示出任何显着的准确性提高(但会减慢收敛速度)。
文中的精华部分。
将模型应用于如图 1 所示的幂律数据存在两个挑战。
首先,由于模型的自回归性质,自回归输入 z i , t − 1 z_{i,t-1} zi,t−1 以及网络的输出(例如 µ µ µ)都直接与观测值 z i , t z_{i,t} zi,t 成比例,但两者之间的网络非线性具有有限的操作范围。在没有进一步修改的情况下,网络因此必须学会将输入缩放到输入层中的适当范围,然后在输出处反转这种缩放。DeepAR通过将自回归输入 z i , t z_{i,t} zi,t 除以与项目相关的比例因子 v i v_{i} vi 来解决这个问题,并反过来将与比例相关的似然参数乘以相同的因子。例如,对于负二项式似然,使用 µ = ν i l o g ( 1 + e x p ( o µ ) ) µ = ν_i log(1 + exp(o_µ)) µ=νilog(1+exp(oµ)) 和 α = l o g ( 1 + e x p ( o α ) ) / √ ν i α = log(1 + exp(o_α))/√ν_i α=log(1+exp(oα))/√νi,其中 o µ , o α o_µ, o_α oµ,oα 是这些参数的网络输出。注意,对于连续型数据,可以在预处理步骤中选择缩放输入,但对于计数分布不可以。选择适当的比例因子本身可能具有挑战性(尤其是在存在数据缺失或数据内差异较大的情况下)。然而,文中实验表明,按平均值缩放 ν i = 1 + 1 t 0 ∑ t = 1 t 0 z i , t ν_i = 1 + \frac{1}{t_0} \sum ^{t0}_{t=1} z_{i,t} νi=1+t01∑t=1t0zi,t 是一种在实践中表现较好的启发式方法。
其次,由于数据的不平衡性,随机均匀地选择训练实例的随机优化过程将很少访问大规模数据中的少量时间序列,从而导致这些时间序列的拟合不足。这在需求预测设置中可能尤其成问题,其中销售速度快的商品可能表现出与销售速度慢的商品质量不同的行为,对销售速度快的商品进行准确预测对于满足某些业务目标可能更重要。为了抵消这种影响,我们在训练期间对样本进行非均匀采样(weighted sampling scheme)。文中加权采样方案中,从尺度为 ν i ν_i νi 的示例中选择窗口的概率与 ν i ν_i νi 成正比。这种采样方案很简单,但有效地补偿了图 1 中的偏差。
详细解释了用到的特征。注意,对于像星期几,小时等离散特征并没有进行one-hot编码,而是直接使用递增的数值。另外,针对商品类别的分类特征使用了Embedding。

DeepAR模型大概每秒可以训练14条时间序列,速度还是非常快的。
我们使用 MXNet 实现我们的模型,并使用包含 4 个 CPU 和 1 个 GPU 的单个 p2.xlarge AWS 实例来运行所有实验。在此硬件上,可以在不到 10 小时内完成在包含 500K 时间序列的大型 ec 数据集上运行的完整训练和预测。虽然预测已经很快,但如果需要,可以很容易地并行化。补充材料中给出了(简单)超参数调整过程、获得的超参数值以及数据集和运行时间的统计数据的描述。
数据集——我们使用五个数据集进行评估。前三部分,电力和交通是公共数据集;部分由 1046 个对齐的时间序列组成,每个序列有 50 个时间步长,代表美国汽车公司 [19] 不同项目的月销售额;电力包含370个客户的电力消耗的每小时时间序列[23];交通,也用于 [23],包含旧金山湾区高速公路 963 条车道的每小时占用率,介于 0 和 1 之间。对于零件数据集,我们使用前 42 个月作为训练数据并报告剩余 8 个月的错误。对于电力,我们使用 2014-01-01 和 2014-0901 之间的数据进行训练,对于交通,我们训练 2008 年之前可用的所有数据 - 06-15。电力和交通的结果是使用在训练中看到的最后一点之后完成的滚动窗口预测来计算的,如 [23] 中所述。我们不会为每个窗口重新训练我们的模型,而是使用在第一个预测窗口之前的数据上训练的单个模型。其余两个数据集 ec 和 ec-sub 是 [19] 中使用的来自亚马逊的每周商品销售量。我们预测 52 周,并在 2014-09-07 之后的一年进行评估。这两个数据集中的时间序列非常多样化和不稳定,从非常快到非常变化的商品,并且包含在预测时间 2014-09-07 前几周推出的“新”产品,见图 3。此外,该数据集中的项目速度具有幂律分布,如图 1 所示。

对于 parts 和 ec/ec-sub 数据集,我们与以下基线模型进行比较,这些基线代表了我们所知的最先进的需求整数数(demand integer)据集:
此外,与两个基线 RNN 模型进行比较,以了解DeepAR的效果:
与 [19] 中一样,我们使用 ρ 风险度量(分位数损失)来量化预测分布的分位数 ρ 的准确性;这些指标的确切定义在补充材料中给出。针对预测范围内的特定跨度 [L, L + S) 评估指标,其中 L 是预测起点之后的提前期。表 1 显示了 0.5 风险和 0.9 风险以及不同的提前期和跨度。这里 all(K) 表示 L < K 的边际 [L, L + 1) 的平均风险。我们根据之前发布的最强方法(基线)对所有报告的指标进行标准化。 DeepAR 在这些数据集上的表现明显优于所有其他方法。结果还显示了使用计数分布对这些数据集进行建模的重要性,因为 rnn-gaussian 的表现要差得多。 ec 和 ec-sub 数据集表现出上面讨论的幂律行为,并且没有缩放和加权采样精度降低(rnn-negbin)。在没有表现出幂律行为的零件数据集上,rnn-negbin 的表现类似于 DeepAR。

三个模型的比较:
在表 2 中,我们将电力和交通数据集的点预测精度与 [23] 中提出的矩阵分解技术 (MatFact) 进行了比较。我们考虑相同的指标,即归一化偏差 (ND) 和归一化 RMSE (NRMSE),其定义在补充材料中给出。结果表明,DeepAR 在两个数据集上的表现都优于 MatFact。


图 3 显示了来自 ec 数据集的示例预测。在图 4 中,ec 数据集上 DeepAR 和 ISSM 的边际预测分布的不同分位数的总和。与 [19] 等 ISSM 模型(其中不确定性的线性增长是建模假设的一部分)相比,不确定性增长模式是从数据中学习的。在这种情况下,模型确实会学习到不确定性随时间的整体增长。然而,这不是简单的线性增长:不确定性(正确地)在第四季度增加,并在不久之后再次减少。

预测分布的校准如图 5 所示。对于每个百分位数
p
p
p,
C
o
v
e
r
a
g
e
(
p
)
Coverage (p)
Coverage(p) 定义为数据集中时间序列中预测分布的百分位数大于真正的目标。对于完美校准的预测,它认为
C
o
v
e
r
a
g
e
(
p
)
=
p
Coverage (p)=p
Coverage(p)=p,对应于对角线。与 ISSM 模型相比,校准总体上有所改进。
关于图5,是用来评估模型预测准确度的。其中,横坐标可以认为是预测值,纵坐标可以认为是真实值。如果预测和真实值相等,那么理想情况下,应该是一条对角线,图中细线所示。越接近细线的曲线,模型的预测效果越好。
为了评估输出中建模相关性的影响,即它们与每个时间点的独立分布有多少不同,我们绘制了打乱的预测(shuffled forecast)的校准曲线,其中对于每个时间点,原始预测的实现已被打乱,破坏时间步长之间的任何相关性。对于仅由一个时间点组成的 short lead-time span(左),这没有影响,因为它只是边际分布。然而,对于 longer lead-time span(右),破坏相关性会导致更差的校准,这表明在时间步长之间捕获了重要的时间相关性。
我们已经证明,基于现代深度学习技术的预测方法可以大大提高对各种数据集的最先进预测方法的预测准确性。我们提出的 DeepAR 模型有效地从相关时间序列中学习了一个全局模型,通过重新缩放和基于速度的采样来处理广泛变化的尺度,生成高精度的校准概率预测,并且能够从数据中学习复杂的模式,例如随时间推移的季节性和不确定性增长。有趣的是,该方法几乎不需要或不需要对各种数据集进行超参数调整,并且适用于仅包含几百个时间序列的中型数据集。
ρ
\rho
ρ-risk metrics


我们使用 MxNet 作为我们的神经网络框架 [5]。实验在笔记本电脑上运行零件,并使用单个 AWS p2.xlarge 实例(具有单个 GPU 的四核机器)运行其他数据集。请注意,即使使用一台机器,也可以在几个小时内端到端地完成所有数据集的预测。我们使用具有提前停止功能的 ADAM 优化器 [16] 和在所有实验中将遗忘偏差设置为 1.0 的标准 LSTM 单元,并从我们的解码器中抽取 200 个样本来生成预测。
对于零件数据集,我们使用前42个月作为训练数据,并报告其余8个月的误差。对于其他数据集电力、交通、ec-sub和ec,可能的训练实例集被子采样为表 3 中所示的数量**。使用[23]中描述的滚动窗口操作报告电力和交通的分数,注意我们没有重新训练我们的模型,而是重复使用相同的模型来预测不同的时间窗口**。运行时间衡量端到端评估,例如处理特征、训练神经网络、抽取样本和评估产生的分布。

对于每个数据集,使用网格搜索来找到超参数项输出嵌入维度和LSTM 节点(例如隐藏的单元数)的最佳值。为此,将预测开始时间之前的数据用作训练集并分成两个分区。对于每个候选超参数,我们将模型拟合到包含 90% 数据的训练集的第一个分区上,并选择在剩余 10% 上具有最小负对数似然的那个。为每个数据集手动调整学习率,并在超参数调整中保持固定。在更大的数据集上增加batch size。
在某些预测设置中,时间点子集的目标值 z i , t z_{i,t} zi,t 可能缺失(或未观察到)。例如,在需求预测的情况下,某个项目可能在某个时间缺货,在这种情况下,无法观察到该项目的需求。没有明确地对这些缺失的观察进行建模(例如,假设观察到的销售与需求相对应,即使在一件商品缺货的情况下),在最好的情况下,可能会导致系统性的预测偏差,在最坏的情况下会导致更大的在供应链背景下,可能导致灾难性的螺旋式下降,缺货情况会导致需求预测降低、重新订购减少和更多缺货情况。在我们的模型中,当计算 (1) 时,通过用来自条件预测分布的样本 z ~ i , t , ∼ l ( ∣ θ ( h i , t ) ) \tilde{z}_{i,t},\sim l(|θ(h_{i,t})) z~i,t,∼l(∣θ(hi,t)) 替换每个未观察值 z i , t z_{i,t} zi,t,并从 (2) 中排除对应于缺失观察值的似然项,可以容易地以有原则的方式处理缺失观察值。我们从论文中省略了此设置中的实验结果,因为根据预测范围内的缺失数据进行适当的评估需要非标准调整指标很难在研究之间进行比较(参见例如 [19])。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#