1

我讨厌问这样一个新手问题,但我确信我做的事情根本上是错误的,而且我很难找到其他同样一无所知的人。

我的 MCMPART 模型的新视图要求用户输入零件的 :length 和 :width 值。从这些值中,我想推导出 :squarefeet (:length * :width/144) 和钣金 :shearsize (:length X :width)。为此,我将模型修改如下:

class Mcmpart < ActiveRecord::Base
    belongs_to :sheet
    belongs_to :partloc
    belongs_to :material

    def squarefeet
      self.squarefeet = self.length * self.width/144
    end

    def shearsize
      self.shearsize = [self.length, self.width].join(' X ')
    end

end

控制器只是通用脚手架,但这里是创建方法:

  def create
    @mcmpart = Mcmpart.new(params[:mcmpart])

    respond_to do |format|
      if @mcmpart.save
        format.html { redirect_to(@mcmpart, :notice => 'Mcmpart was successfully created.') }
        format.xml  { render :xml => @mcmpart, :status => :created, :location => @mcmpart }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @mcmpart.errors, :status => :unprocessable_entity }
      end
    end
  end

为了明确模型的构建,这里是数据库迁移文件:

class CreateMcmparts < ActiveRecord::Migration
  def self.up
    create_table :mcmparts do |t|
      t.string :partnumber
      t.references :material
      t.references :sheet
      t.references :partloc
      t.decimal :length, :precision => 10, :scale => 3
      t.decimal :width, :precision => 10, :scale => 3
      t.decimal :squarefeet, :precision => 10, :scale => 3
      t.decimal :weight, :precision => 10, :scale => 3
      t.string :shearsize
      t.string :project
      t.boolean :bus

      t.timestamps
    end
  end

  def self.down
    drop_table :mcmparts
  end
end

我相信有人会马上发现我的问题。这正在创建一个虚拟属性,该属性仅在我的 SHOW 视图中显示。但是,我想要的是将 :shearsize 和 :squarefeet 参数添加到我的数据库中。相反,我在我的数据库中得到了两个属性的 nil 值。而且由于它不是我需要的实例属性,它不受我数据库中设置的精度/比例值的约束,因此在小数点后显示多达 8 位数字。

我需要在控制器中做些什么吗?我试图用@mcmpart.shearsize 替换self.shearsize,但这只会导致我的页面失败。

感谢第一个指出我的菜鸟错误的人。

谢谢,

4

2 回答 2

1

基于以下假设,我正在尝试解决您的问题。

  1. 长度和宽度不是数据库属性。
  2. Mcmpart 模型与您提供的一样。

首先将这些行添加到您的 Mcmpart 模型中

before_save :prepopulate #being dumb here, name anything you want but not attribute name like you already did.
attr_accessor :length, width

private

def prepopulate
  self.squarefeet = self.length * self.width/144
  self.shearsize = [self.length, self.width].join(' X ')
end

所以这就是你的模型在这些添加之后的样子。

class Mcmpart < ActiveRecord::Base
  belongs_to :sheet
  belongs_to :partloc
  belongs_to :material

  before_save :prepopulate 
  attr_accessor :length, :width

  private

  def prepopulate
    self.squarefeet = self.length * self.width/144
    self.shearsize = [self.length, self.width].join(' X ')
  end
end

这应该现在可以工作了。如果没有,那么我需要更多细节,因为我不清楚。如果您可以发布控制器和模型(完整代码)会更好。

于 2011-08-11T05:51:19.643 回答
0

我可以看到您的困惑 sheersize 和 squarefeet 都是计算值,对吗?他们在你的观点中工作,对吗?

因此,您要将它们存储在数据库中的唯一原因是您可以正确格式化它们?

如果上述假设是正确的,那么您不需要将它们存储在数据库中,您可以在计算它们时对其进行格式化,并且有各种视图助手来限制显示的小数点数。

我不知道你想显示多少个小数点,但如果你想显示 2 个小数位,你可以试试这个

def squarefeet
  self.squarefeet = self.length * self.width/144
  "%.2f" % self.squarefeet %>
end

def shearsize
  self.shearsize = [self.length, self.width].join(' X ')
  "%.2f" % self.shearsize %>
end

将 .2f 更改为 .4f 如果您想要 4 个小数位或任何您想要的小数位数

如果您有其他原因将数据存储在数据库中,那么我建议您使用保存过滤器并在那里进行计算。如果您想了解更多信息,请询问

于 2011-08-11T05:59:31.133 回答