我想要兩個輸入欄位,但資料庫中只有一列。第一個輸入是以數字形式存盤的資料,另一個是以數字形式存盤的資料除以 24。您只能將資料放在一個欄位中。有沒有辦法做到這一點?
UPD:遷移:
def change
add_column :employees, :hourly_payment , :integer
end
查看:員工/_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 %>
uj5u.com熱心網友回復:
您的模型和資料庫表是應用程式的內部結構,實際上并沒有通過任何方式與視圖相關聯,除了 ActiveRecord 使用約定優于配置來鏈接兩者*。
在 Rails 風格的 MVC 中,控制器負責將用戶輸入傳遞給模型。通常你會通過簡單的質量分配來做到這一點:
class UsersController < ApplicationController
def create
@user = User.new(user_params)
# ...
end
private
def user_params
params.require(:user)
.permit(:email, :salary)
end
end
這基本上只是將列入白名單的引數散列直接傳遞給模型,所有這些都傳遞給 ActiveRecord 通過讀取資料庫模式為您神奇地創建的設定器。
但是沒有什么可以阻止您手動分配屬性:
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
end
或者使用引數物件:
def user_params
params.require(:user)
.permit(:email)
.merge(salary: calculated_salary)
end
畢竟這只是類固醇的散列。Rails 唯一會阻止您的是傳遞尚未列入白名單的引數物件。
您可以在控制器中執行的操作沒有石碑。唯一要記住的是,控制器是出了名的難以測驗,而胖控制器是災難的根源。
如果您正在做更復雜的事情,還有更好的解決方案,例如表單物件、裝飾器或服務物件。
uj5u.com熱心網友回復:
您需要為此創建一個視圖。以下是遷移示例:
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
然后,您可以使用my_new_value模型上的方法訪問您的值。您需要更改與您的模型匹配的默認表的名稱。
class MyModel
self.table_name = 'my_view_models'
end
并通過
MyModel.first.my_new_value
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426764.html
上一篇:TicTacToe重勝條件
