mysql - 具有 MYSQL 后端的 Ruby on Rails 中的虚拟属性和实例属性之间的区别

标签 mysql ruby-on-rails windows-7 rails-activerecord

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

我的 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 但这只会导致我的页面失败。

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

谢谢,

最佳答案

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

  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

现在应该可以了。如果没有,那么我需要更多细节,因为我不清楚。如果能贴出controller和model(完整代码)就更好了。

关于mysql - 具有 MYSQL 后端的 Ruby on Rails 中的虚拟属性和实例属性之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7021041/

相关文章:

windows-7 - 从 VBScript 提升权限

windows-7 - 如何在没有 Visual Studio 的情况下在 Windows 7 上安装服务?

windows-7 - Xamarin Forms 可以在 Windows 7 上运行吗

php - Move_uploaded_foto 到数据库

php - 与服务器对话的 iPhone 应用程序

python - 使用 python 和 mysqldb 将 csv 数据获取到 mysql 表中

ruby-on-rails - 如何在 Chrome 浏览器中查看在机器上的本地主机中运行的网站?

ruby-on-rails - 如何在 Ruby 中正确链接自定义方法?

mysql - SQL 查询 - 从 3 个表中查询 ID 顺序

mysql - 使用 "IN"缓慢查询 MySQL