我有一个具有以下参数的模型。
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
参数,该参数应为{ {1}}和kids
。
Muy控制器为:
girls
答案 0 :(得分:0)
在Colegio.rb模型中添加以下内容:
before_validation :sum_values
.
.
...
private
def sum_values
self.total_persons = self.kids + self.girls
end
在保存记录之前,将运行before_validation。
答案 1 :(得分:0)
首先,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
答案 2 :(得分:0)
根据经验,在DB中创建一个可以轻松从同一(甚至不同)表派生其值的列不是一个好主意,因为这违反了数据库的原理规范化,也就是说,任何重复的数据弊大于利(在某些实际情况下,运行时开销过大除外)。而是在Rails中定义一个新方法。在您的情况下,是这样的:
public static IOrderedEnumerable<string> GetFiles(string batchFilePath)
{
if (Directory.Exists(batchFilePath))
{
var directoryInfo = new DirectoryInfo(batchFilePath);
var fileEntries = directoryInfo.GetFiles(@"Batch *.xlsx").Select(x => x.Name).OrderBy(f => GetFileDay(f));
return fileEntries;
}
return null;
}
private static DateTime GetFileDay(string file)
{
var date = default(DateTime);
var extractedDate = Regex.Match(file, @"(\W\S*(\d[\d]{0,2}))").Value;
extractedDate = extractedDate.Replace(".", "-").Trim();
DateTime.TryParseExact(extractedDate, "d-MM-yy", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out date);
return date;
}
然后,使用该方法,例如,
def total_persons
kids + girls
end