添加两个导致同一模型的另一个参数的参数

时间:2018-11-02 06:12:41

标签: ruby-on-rails

我有一个具有以下参数的模型。

  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方法,在其中输入kidsgirls的数量,并想更新total_persons参数,该参数应为{ {1}}和kids

Muy控制器为:

girls

3 个答案:

答案 0 :(得分:0)

在Colegio.rb模型中添加以下内容:

before_validation :sum_values 
.
.
...
private 

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

在保存记录之前,将运行before_validation。

答案 1 :(得分:0)

首先,kindsgirls列的类型应为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