我讨厌问这样一个新手问题,但我确信我做的事情从根本上是错误的,而且我很难找到其他人一样一无所知。
我的 MCMPART 模型的新 View 要求用户输入零件的 :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
Controller 只是通用脚手架,但这里是创建方法:
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 View 中创建一个仅显示 find 的虚拟属性。但是,我想要的是将 :shearsize 和 :squarefeet 参数添加到我的数据库中。相反,我在我的数据库中得到了两个属性的 nil 值。由于它不是我需要的实例属性,因此它不受我数据库中设置的精度/比例值的约束,因此在小数点后显示多达 8 位数字。
我需要在 Controller 中做些什么吗?我尝试用 @mcmpart.shearsize 替换 self.shearsize 但这只会导致我的页面失败。
感谢第一个指出我菜鸟错误的人。
谢谢,
最佳答案
基于以下假设,我正在尝试解决您的问题。
- 长度和宽度不是数据库属性。
- 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
现在应该可以了。如果没有,那么我需要更多细节,因为我不清楚。如果能贴出controller和model(完整代码)就更好了。
关于mysql - 具有 MYSQL 后端的 Ruby on Rails 中的虚拟属性和实例属性之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7021041/