mam taki przypadek, mam model w którym są 2 pola z datami from, to, order_id oraz inne. Robię poniższe zapytanie które działa jak najbardziej ok
select sum(datediff(date_to, date_from)) as days from license_documents where order_id=184 and license_id=4
mam natomiast jeden problem, nie wiem jak dobrać się z poziomu ruby do zmiennej days.
Jak robię to jak poniżej to nie jestem w stanie dostać się za pomocą zmiennej doc do tej sumy days
[code]LicenseDocument.where(“select order_id, license_id, sum(datediff(date_to, date_from)) as days from license_documents where order_id = ? and license_id = ?”, order_id, line_item.license_id). each do |doc|
end[/code]
jak robiłem bezpośrednie zapytanie i testowałem to np. w IRB to dostaję tablicę z jednym elementem której wartość jest np. taka [[#BigDecimal:a5c3398,‘0.1E1’,9(18)]] .
Prośba o pomoc, jak tu dostać się do tej sumy, bo najszybciej jest dla mnie wykonać ten kod po stronie mysql niż ruby.
O ile zrozumiałem co chcesz zrobić i z czego korzystasz to moim zdaniem powinieneś na początku do modelu dodać metodę która będzie potrafiła policzyć ile dni licencji pozostało (podkreślam o ile zrozumiałem intencje)
class LicenseDocument < ActiveRecord::Base
def days_to_end
((date_to - date_from) / 1.day).to_i
end
end
potem pobrać odpowiedni obiekt i na nim zawłać metodę days_to_end:
dzięki za odpowiedź ale chodzi o to, że całe wyliczenie robi mi mysql za pomocą tego zapytania co napisałem więc nie chcę żeby ruby w ogóle było tu używane, jeżeli spokojnie mysql zrobi mi to o wiele szybciej.
jedyne co chcę to dobrać się do wyniku ale tu mam problem. W przypadku gdy chcę odwołać się do kolumny days która jest stworzona dynamicznie w zapytaniu nie mogę zrobić tego standardowo za pomocą modelu bo wyrzuca błąd bo nie ma takiego pola w modelu.
W związku z tym chciałem zrobić bezpośrednie zapytanie do bazy i z wyniku zapytania wyciągnąć to pole ale nie wiem jak to zrobić.
Korzystam z railsów i activerecord ale tutaj to myślałem żeby coś takiego zrobić
sql = ActiveRecord::Base.connection()
sql.execute("select sum(datediff(date_to, date_from)) as days from license_documents where order_id=184 and license_id=3")
dobra, już mam odpowiedź, niestety chodzi o to, że typy danych nie pasowały i trzeba było zrobić konwersję z BigDecimal do INT w Mysql żeby później w ruby można było normalnie dostać się do wyniku tak więc
select cast(sum(datediff(date_to, date_from)) as signed ) as days from license_documents where order_id=184 and license_id=4