2011-08-11 10 views
1

初心者の質問には嫌ですが、私は根本的に何か間違っていると確信しています。無知。MYSQLバックエンドを使用したRuby on Railsの仮想属性とインスタンス属性の違い

私のMCMPARTモデルの新しいビューでは、長さと幅の値を入力する必要があります。これらの値からsquarefeet(:length *:width/144)と板金:shearsize(:長さX:幅)を求めたいと思います。次のようにこれを行うために、私は私のモデルを変更した:

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 paramsをデータベースに追加することです。代わりに、私のデータベースの両方の属性の値がゼロになっています。そして、それは私が必要とするインスタンス属性ではないので、私のデータベースに設定された精度/位取りの値に支配されていないので、小数点以下8桁まで表示します。

コントローラーで何かする必要がありますか?私はself.shearsizeを@ mcmpart.shearsizeに置き換えようとしましたが、それは単に私のページが失敗する原因になります。

私のルーキーエラーを指摘する最初の人に誇り。

は、私はあなたの問題を解決しようとしているという仮定を以下に基づいて

+0

コントローラから作成アクションを投稿してください。 – Bohdan

+0

コントローラコードが追加されました。ありがとうございました。 – Byron

答えて

1

、ありがとうございました。

  1. 長さと幅はDB属性ではありません。
  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 

これで動作するはずです。それがなければ私はそれが私には不明であるので詳細が必要です。コントローラとモデル(完全コード)を投稿できる方が良いでしょう。

+0

私は私の質問ではっきりしていたはずです。 LengthとWidthはDB属性です。私は明確にするために、元の質問にDB移行ファイルの内容を追加しました。ありがとうございました。私はあなたの提案を実装しようとし、この追加情報から生じる可能性のあるあなたの応答の変更を監視します。 – Byron

+0

大丈夫です。 attr_accessorを削除してください:私の解決策から長さ、幅: – ducktyped

+0

チャンピオンのように働いた – Byron

0

私はあなたの混乱を見ることができます sheersizeとsquarefeetはどちらも正しい計算値ですか? 彼らはあなたの意見を正しく扱いますか?

これをデータベースに保存する唯一の理由は、正しい形式にすることができるからです。

上記の仮定が正しい場合は、データベースに格納する必要はありません。計算する際にフォーマットすることができ、表示される小数点の数を制限するさまざまなビューヘルパーがあります。

私はあなたが表示したいどのように多くの小数点見当がつかないが、あなたは小数点以下2桁を表示したい場合、あなたは小数点以下4桁を望んでいたか、どのような場合には、この

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 

変更が.4fする.2f試みることができます小数点以下桁数

データベースにデータを保存する他の理由がある場合は、オンセーブフィルタを使用してそこにキャリブレーションを行うことをお勧めします。さらに詳しい情報が必要な場合は、

+0

ありがとうございました。さらに学習過程に入るほど、実際にはどうしたらデータベースに入る必要があるのでしょうか?明らかにt.reference属性はそうですが、それはクライアント側で導き出すことができる非常に多くのデータです。先端に感謝します。 – Byron

+0

あなたはRails特有のものではないプログラミングの学習曲線に乗っています:)幸運を祈る! – jamesc