Добавьте два параметра, которые приведут к другому параметру той же модели - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть модель со следующими параметрами.

  create_table "colegios", force: :cascade do |t|
    t.float    "Kids"
    t.float    "Girls"
    t.float    "total_persons"
    t.datetime "created_at",       null: false
    t.datetime "updated_at",       null: false
  end

Я хочу использовать метод new, где я ввожу число kids и girls и хочу обновить параметр total_persons, который будет суммой kids и girls.

Мой контроллер:

  def new
    @colegio = Colegios.new
  end

  # GET /colegios/1/edit
  def edit
  end

  # POST /colegios
  # POST /colegios.json
  def create
    @colegio = Colegios.new(colegio_params)

    respond_to do |format|
      if @colegio.save
        format.html { redirect_to @colegio, notice: 'Successfully created.' }
        format.json { render :show, status: :created, location: @colegio }
      else
        format.html { render :new }
        format.json { render json: @colegio.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /colegios/1
  # PATCH/PUT /colegios/1.json
  def update
    respond_to do |format|
      if @colegio.update(colegio_params)
        format.html { redirect_to @colegio, notice: 'Successfully updated.' }
        format.json { render :show, status: :ok, location: @colegio }
      else
        format.html { render :edit }
        format.json { render json: @colegio.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_colegio
      @colegio = Colegio.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def colegio_params
      params.require(:colegio).permit(:niños, :niñas, :total_personas)
    end

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Прежде всего столбцы kinds и girls должны быть integer тип, а не float тип

Измените ваш сильный параметр, чтобы явно установить значение total_personas

def colegio_params
  cp = params.require(:colegio).permit(:niños, :niñas)
  cp[: total_personas] = params[:colegio][: Kids].to_i + params[:colegio][: Girls].to_i
  cp
end
0 голосов
/ 02 ноября 2018

Как правило, не рекомендуется создавать столбец (столбцы) в БД, значение которого может быть легко получено из одной и той же (или даже другой) таблицы, поскольку это противоречит принципу базы данных. нормализация, а именно, любое дублирование данных приносит больше вреда, чем пользы (за исключением некоторых практических случаев, когда накладные расходы слишком велики). Вместо этого в Rails определите новый метод. В вашем случае это что-то вроде этого:

def total_persons
  kids + girls
end

Затем используйте метод как, например,

Colegio.first.total_persons  # => the sum of the two columns
0 голосов
/ 02 ноября 2018

В модели Colegio.rb добавьте это:

before_validation :sum_values 
.
.
...
private 

def sum_values 
  self.total_persons = self.kids + self.girls
end

Before_validation будет запущен перед сохранением записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...