Разница между виртуальными атрибутами и атрибутами экземпляра в Ruby on Rails с бэкэндом MYSQL - PullRequest
1 голос
/ 11 августа 2011

Я ненавижу задавать такой вопрос новичку, но я уверен, что я делаю что-то в корне неправильно, и мне трудно найти других, которые так же не понимают.

НОВЫЙ вид моей модели MCMPART требует от пользователя ввода значений для: длины и: ширины детали. Из этих значений я хочу получить: квадратные футы (: длина *: ширина / 144) и листовой металл: размер ножниц (: длина 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

Контроллер - это просто универсальный каркас, но вот метод create:

  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 в мою базу данных. Вместо этого я получаю нулевое значение для обоих атрибутов в моей базе данных. И поскольку это не атрибут экземпляра, как мне требуется, он не регулируется значениями точности / масштаба, установленными в моей базе данных, и поэтому отображает целых 8 цифр после десятичной точки.

Что-то мне нужно сделать в контроллере? Я пытался заменить self.shearsize на @ mcmpart.shearsize, но это просто приводит к сбою моих страниц.

Престижность первому человеку, который указал на мои ошибки новобранца (ов).

Спасибо,

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Исходя из следующего предположения, я пытаюсь решить вашу проблему.

  1. длина и ширина не являются атрибутами БД.
  2. Модель Макмпарта такая, какая вы ее предоставили.

Сначала добавьте эти строки в модель 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 голосов
/ 11 августа 2011

Я вижу твое замешательство 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 десятичных знака или любое другое количество десятичных разрядов, которое вы хотите иметь

Если у вас есть другие причины для хранения данных в базе данных, я предлагаю вам использовать фильтр сохранения и выполнять там вычисления. Если вы хотите больше информации об этом, спросите

...