Предположим схему, подобную этой:
create_table "bills", :force => true do |t|
t.decimal "cost", :precision => 10, :scale => 5
end
Я хочу написать функцию, которая записывает новый счет в БД, если он уникален.Следующее не работает:
def load_bill_unless_exists(candidate)
incumbents = Bill.scoped.where(:cost => candidate.cost)
candidate.save unless incumbents.exists?
end
, поскольку действующие и потенциальные счета имеют разные ограничения в своем представлении BigDecimal, поэтому тест :cost => candidate.cost
не пройден.То есть он сравнивает:
candidate: #<Bill id: nil, cost: #<BigDecimal:105e39850,'0.1670576666 6666666E4',27(27)>>
с
incumbent: #<ServiceBill id: 198449, cost: #<BigDecimal:105e35840,'0.167057667E4',18(18)>>
Обратите внимание, что BigDecimal кандидата представляет стоимость с большим количеством цифр, чем у действующего.
Таким образом, вопрос прост: Как правильно провести это сравнение?Я размышлял :cost => BigDecimal.new(candidate.cost.to_s, 18)
, но это не так - например, откуда взялась эта цифра 18?