Существует пара различий, но они не являются большими:
.create
эквивалентно .new
сопровождаемый .save
. Это просто более сжато. .create!
эквивалентно .new
сопровождаемый .save!
(бросает ошибку при сохранении сбоев). Это - также просто крошечный бит короче .build
, главным образом псевдоним для .new
. Это прокладывает себе путь в направляющих 3 и иначе в направляющих < 3.x самая важная часть, однако, то, что эти методы можно назвать через ассоциацию (has_many
, и т.д.) для автоматического соединения этих двух моделей.
Приведение могло работать только в том случае, если таблица, возвращаемая методом, действительно была экземпляром MarketValueDataTable
. Если это не так, все, что вы можете сделать, это скопировать данные в экземпляр MarketValueDataTable
. Например, вы можете использовать метод Merge
:
DataTable data = GetData();
MarketValueDataTable myData = new MarketValueDataTable();
myData.Merge(data);
Если ваша таблица данных является общей таблицей, то ее нельзя преобразовать в MarketValueDataTable.
Вы можете попробовать создать новый объект MarketValueDataTable и вручную добавить в него строки. Пройдя по строкам вашей общей таблицы данных, а затем по столбцам каждой строки, вы можете использовать отражение, чтобы установить значения свойств нового MarketValueDataTableRow.
Примерно так (предупреждение - псевдокод):
MarketValueDataTable mv = new MarketValueDataTable();
foreach(DataRow row in table.Rows)
{
MarketValueDataTableRow mvrow = mv.NewRow();
foreach(DataColumn col in table.Columns)
{
PropertyInfo colProperty = mvrow.GetType().GetProperty(col.Name);
colProperty.SetValue(mvRow, row[col]);
}
mv.Rows.Add(mvrow);
}
Вы уловили общую идею. Пройдитесь по строкам общей таблицы и используйте отражение, чтобы найти совпадающие свойства в конкретной строке типизированных данных.
Вы не можете преобразовать DataTable в MarketValueDataTable по той простой причине, что он не наследуется от него.