Quiero tener dos campos de entrada, pero solo una columna en la base de datos. La primera entrada son datos almacenados en números y la otra es datos almacenados en números divididos por 24. Puede poner datos solo en un campo. ¿Hay alguna manera posible de hacer esto?
UPD: Migración:
def change add_column :employees, :hourly_payment , :integer endVer: empleados/_form.html.erb
<%= simple_form_for @employee do |form| %> <%= form.input :name %> <%= form.input :hourly_payment %> <%= form.input :monthly_payment %> <%= form.button :submit, class: "btn btn-success" %> <% end %>Su modelo y las tablas de la base de datos son el interior de su aplicación y no están vinculados a la vista por nada, excepto por la facilidad con la que ActiveRecord hace que use la convención sobre la configuración para vincular los dos *.
En Rails estilo MVC, el controlador es responsable de pasar la entrada del usuario al modelo. Por lo general, solo haría esto con una asignación masiva simple:
class UsersController < ApplicationController def create @user = User.new(user_params) # ... end private def user_params params.require(:user) .permit(:email, :salary) end endBásicamente, esto es simplemente pasar un hash de parámetros en la lista blanca directamente al modelo tal como está y todo se pasa a los configuradores que ActiveRecord creó mágicamente para usted al leer el esquema de la base de datos.
Pero no hay nada que le impida asignar atributos manualmente:
class UsersController < ApplicationController def create @user = User.new(user_params) do |user| user.salary = calculated_salary end # ... end private def user_params params.require(:user) .permit(:email) end def calculated_salary if params[:user][:hourly_payment].present? params[:user][:hourly_payment] elsif params[:user][:monthly_payment].present? params[:user][:monthly_payment].to_i / 168 else 0 # sorry no cookies for you end end endO jugando con el objeto de parámetros:
def user_params params.require(:user) .permit(:email) .merge(salary: calculated_salary) endDespués de todo, es solo un hash con esteroides. Lo único que Rails le impedirá es pasar un objeto de parámetros que no haya sido incluido en la lista blanca.
No hay tableta de piedra para lo que puedes hacer en un controlador. Lo único a tener en cuenta es que los controladores son notoriamente difíciles de probar y los controladores gordos son una receta para el desastre.
Si está haciendo algo más complicado, existen mejores soluciones, como objetos de formulario , decoradores u objetos de servicio.
Deberá crear una vista para eso. Aquí hay un ejemplo de migración:
def up sql = %(CREATE OR REPLACE VIEW my_view_models AS SELECT m.*,m.int_field*12 as my_new_value from my_models m ) self.connection.execute(sql) end def down self.connection.execute('DROP VIEW IF EXISTS my_view_models') end Luego, puede acceder a su valor con el método my_new_value en su modelo. Deberá cambiar el nombre de la tabla predeterminada que coincida con su modelo.
class MyModel self.table_name = 'my_view_models' endY accede a través de
MyModel.first.my_new_value