Why is this string being converted to BigDecimal? - ruby-on-rails

I am debugging a rails app for my boss while he is on vacation. We have an app the company uses that we can use to fill out timesheets and view customer tickets. On the open tickets page, there is a column with a brief description of the ticket. We have an environment on Ubuntu for production, and an XP environment for development, both of those don't experience the bug. But if I run the environment on Windows 7 or newer, the description doesn't show up as a string but as a BigDecimal, usually as "0.0" some of the tickets show other numbers. I would post screenshots but I won't for the privacy of the company.
Here's what I know so far: The database we are using displays the actual description in the table. The view and controller are both explicitly converting to string, when I got rid of .to_s in the code, the bug persisted. I have the class type being sent to a logfile as well that confirms it is a BigDecimal. When running the production code from my machine the bug persisted. I think it is an OS compatibility issue possibly. Or somewhere between the database and the app itself, the data is being converted to BigDecimal in a file that I don't yet know about. I am running rails 3.0.7 and ruby 1.9.2p290
Here is the code I think is suspect:
<div id="page_center">
<div id="branding_row">
<%= label_tag("Show_Open", "Show Open Tickets",{:class => 'page_label'}) -%>
</div>
<div id="tabs">
<ul>
<% #locationHash.keys.each do |keyItem| %>
<li><%= keyItem %></li>
<% end %>
</ul>
<% #locationHash.keys.each do |keyItem| %>
<div id="tabs-<%= keyItem %>">
<table >
<tr >
<th style="width:50px; empty-cells:hide;">WO#</th>
<th style="width:125px; empty-cells:hide;">Customer Name</th>
<th style="width:125px; empty-cells:hide;">Description</th>
<th style="width:65px; empty-cells:hide;">Tech</th>
<th style="width:125px; empty-cells:hide;">Date/Time</th>
</tr>
<% #locationHash[keyItem].each do |ticketItem| %>
<tr>
<td><%= ticketItem.work_order.to_s %></td>
<td><%= ticketItem.customer_name.to_s %></td>
<td><%= ticketItem.woDesc.to_s %></td>
<td><%= ticketItem.tech.to_s %></td>
<td><%= ticketItem.created_at.to_s %></td>
</tr>
<% end %>
</table>
</div>
<% end %>
</div>
</div>
<div id="right_column">
</div>
Here's the controller:
class TicketsController < ApplicationController
def populate_workOrders
#customerId = params[:customerID]
logger.debug "#customerId = #{#customerId.to_s}"
#tickets = Ticket.where(:customer_id => #customerId)
logger.debug "#tickets size = #{#tickets.size.to_s}"
#outputTickets = Array.new
#tickets.each {|ticketItem|
#select only tickets with specific open/usable codes
if ['ARV','CAN','COM','D','H','O','S','PERM','CB','CN'].include?( ticketItem.woStatus )
logger.debug "workorder - #{ticketItem.work_order} status - #{ticketItem.woStatus}"
#outputTickets << ticketItem
end
}
respond_to do |format|
format.json { render :json => #outputTickets.to_json }
end
end
def show_open
logger.debug "****** inside Tickets - show_open ******"
#customersHash = Hash.new
#locationHash = Hash.new
#tempTicketArray = Array.new
# #customers = Customer.all
# logger.debug "#customers size = #{#customers.size.to_s}"
# #customers.each {|customerItem|
# #customersHash[customerItem.id] = customerItem
# }
## updates names
# #allTickets = Ticket.all
# #allTickets.each{|ticketItem|
# ticketItem.customer_name = #customersHash[ticketItem.customer_id].name
# ticketItem.save
# }
#tickets = Ticket.where(woStatus: ['ARV','CAN','COM','D','H','O','S'])
logger.debug "#tickets size = #{#tickets.size.to_s}"
#tickets.sort_by!{|y| [y.work_order]}.reverse!
#tickets.each {|ticketItem|
logger.debug "#{ticketItem.customer_name.to_s } + #{ticketItem.woDesc.class}"
if #locationHash.has_key?(ticketItem.office)
#locationHash[ticketItem.office] << ticketItem
else
#locationHash[ticketItem.office] = Array.new
#locationHash[ticketItem.office] << ticketItem
end
}
#locationHash.keys.each {|keyItem|
logger.debug "#{keyItem} array size = #{#locationHash[keyItem].size.to_s}"
#locationHash[keyItem].each{|ticketItem|
logger.debug "#{ticketItem.customer_name.to_s } - #{ticketItem.woDesc.class}"
}
}
end
end
Here is schema.rb with irrelevant parts ommitted:
create_table "customers", :force => true do |t|
t.string "number"
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "entries", :force => true do |t|
t.string "customer"
t.string "work_order"
t.text "description"
t.string "arrival_time"
t.string "depart_time"
t.integer "day_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "timesheet_order"
t.integer "user_id"
t.boolean "submitted"
t.integer "ticket_id"
t.integer "customer_id"
t.integer "type_id"
t.integer "productivityType"
end
create_table "ticket_import", :id => false, :force => true do |t|
t.string "srvStat"
t.string "offId"
t.string "callNbr"
t.string "custName"
t.string "priorityLevel"
t.string "svcDescr"
t.string "techId"
t.string "endDte"
t.string "custNum"
end
create_table "tickets", :force => true do |t|
t.string "work_order"
t.integer "customer_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "woStatus"
t.string "office"
t.text "woDesc"
t.string "tech"
t.string "entDate"
t.string "customer_name"
end

Related

Doing a joined search in rails

I'm working on doing a simple joined search within a rails project. What I want to do is find a description of an item based on what the user enters in a search box. The error that I'm most commonly getting is:
Mysql2::Error: Unknown column 'item.description' in 'where clause': SELECT item_instances.* FROM item_instances INNER JOIN items ON items.id = item_instances.item_id WHERE item.description = 'server'
The search.html.erb page looks like the following:
<p>
Search results base on database field <span class='bold'><%= #columnType %></span>
with value: <span class='bold'><%= #search_value %> </span>
</p>
<p>Total Report Cost: <span class='bold'>$<%= #cost %><span></p>
<table class='reportTable'>
<thead>
<tr>
<th class='reportTableHeaderCell'>Inv number</th>
<th class='reportTableHeaderCell'>Description</th>
<th class='reportTableHeaderCell'>Serial</th>
<th class='reportTableHeaderCell'>PO number</th>
<th class='reportTableHeaderCell'>PO date</th>
<th class='reportTableHeaderCell'>Invoice</th>
<th class='reportTableHeaderCell'>Date Out</th>
<th class='reportTableHeaderCell'>Cost</th>
<th class='reportTableHeaderCell'>Acro</th>
</tr>
</thead>
<tbody>
<% #item_instances.each do |item_instance| %>
<tr class='searchTableRow'>
<td class='reportTableCell'><%= link_to item_instance.inv_number, edit_item_instance_path(item_instance) %></td>
<td class='reportTableCell'><%= item_instance.item.description %></td>
<td class='reportTableCell'><%= item_instance.serial %></td>
<td class='reportTableCell'><%= item_instance.po_number %></td>
<td class='reportTableCell'><%= item_instance.po_date %></td>
<td class='reportTableCell'><%= item_instance.invoice %></td>
<td class='reportTableCell'><%= item_instance.date_out %></td>
<td class='reportTableCell'><%= item_instance.cost %></td>
<td class='reportTableCell'><%= item_instance.acro %></td>
</tr>
<% end %>
</tbody>
</table>
item_instances.rb (model) file
class ItemInstance < ApplicationRecord
validates :inv_number, :serial, :cost, presence: true
belongs_to :item
scope :in_order, ->{order(:description)}
# Named Scopes
scope :search_for_records_by_date, ->(startDate, endDate) { where(date_out: startDate..endDate) }
scope :search_for_records_by_column_and_value, ->(columnName, value) { where("#{columnName}": "#{value}") }
#I know something may be wrong in here.
scope :search_for_records_by_column_and_value_item_table, ->(columnName, value) { where(item: "#{columnName}": "#{value}") }
end
The items model:
class Item < ApplicationRecord
validates :description, :cost, :list_price, presence: true
has_many :item_instances, dependent: :delete_all
scope :in_order, ->{order(:description)}
scope :search_for_active_items, ->(active) { where(active: active) }
scope :search_for_records_by_column_and_value_on_items, ->(columnName, value) { where("#{columnName}": "#{value}") }
end
The item_instances Controller:
class ItemInstancesController < ApplicationController
def search
# Getting the params from what the user submitted
#columnType = params[:columnType]
#search_value = params[:search_value]
if #columnType == 'description'
# SIMPLE THINGS I've TRIED:
# #item_instances = ItemInstance.joins(:item).where(item: {description: "server"})
##item_instances = ItemInstance.joins(:items)
#I TRIED THIS JUST TO SEE IF I COULD GET ANYTHING
#item_instances = ItemInstance.joins(:item).where(:item => {description: "server"})
##item_instances = ItemInstance.joins(:item).search_for_records_by_column_and_value_item_table(#columnType, #search_value)
end
respond_to do |format|
format.html { render :search }
end
end
end
The Routes file:
Rails.application.routes.draw do
resources :item_instances
get '/report', to: 'item_instances#report'
get '/search', to: 'item_instances#search'
resources :items
get '/active', to: 'items#active'
# Route to the home page
root 'item_instances#home'
end
schema.rb File:
ActiveRecord::Schema.define(version: 2020_08_17_190727) do
create_table "item_instances", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.integer "inv_number"
t.string "serial"
t.integer "po_number"
t.date "po_date"
t.date "invoice"
t.date "date_out"
t.decimal "cost", precision: 8, scale: 2
t.string "acro"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "item_id"
t.index ["item_id"], name: "fk_rails_6ea33fd9d0"
end
create_table "items", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.string "description"
t.decimal "cost", precision: 8, scale: 2
t.decimal "list_price", precision: 8, scale: 2
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "active"
end
add_foreign_key "item_instances", "items"
end
Please let me know if anything else is needed. I've looked through multiple articles and stackoverflow posts with no luck. Anything that can help will be appreciated.
In your item_instances_controller.rb, replace item with items in where condition. While where condition you must specify complete table name for comparison.
class ItemInstancesController < ApplicationController
def search
#yourcode
#item_instances = ItemInstance.joins(:item).where(:items => {description: "server"})
#yourcode
end
end

Action Controllers and filtering

I'm developing an app where an admin can see a group of users in HTML tables that are filtered by ":platoon => A,B,C,D"
All users are stored in a "users model" and I'm trying to have multiple HTML tables on one page showing only the users associated to that platoon.
UsersController:
class UsersController < ApplicationController
def index
#users = User.all
#a_platoon = #users.where(:platoon => #A)
#b_platoon = #users.where(:platoon => #B)
#c_platoon = #users.where(:platoon => #C)
#d_platoon = #users.where(:platoon => #D)
end
end
and in my index.html.erb:
<thead>
<tr>
<th>Name</th>
<th>Reg Number</th>
<th>Phone</th>
<th>Alt Phone</th>
<th colspan="7"></th>
</tr>
</thead>
<tbody>
<% #b_platoon.each do |b_platoon| %>
<tr>
<td><%= b_platoon.name %></td>
<td><%= b_platoon.reg_number %></td>
<td><%= b_platoon.phone %></td>
<td><%= b_platoon.alt_phone %></td>
</tr>
<% end %>
</tbody>
The goal here is to display all the users associated with b_platoon.
I'm not getting any errors, but my table just displays blank. I believe my problem lies in the controller methods but I'm not skilled enough to find it and I struggled with finding helpful documentation.
If it may help, heres my schema for my "Users" model:
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
t.integer "reg_number"
t.string "platoon"
t.string "phone"
t.string "alt_phone"
t.boolean "admin", default: false
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
Use b_platoon.your_field instead user.your_field
<% #b_platoon.each do |b_platoon| %>
<tr>
<td><%= b_platoon.name %></td>
<td><%= b_platoon.reg_number %></td>
<td><%= b_platoon.phone %></td>
<td><%= b_platoon.alt_phone %></td>
</tr>
<% end %>
You must call methods on enumerator in a .each

show elements of related tables with ng-repeat

I am trying to show a column of a related table with ng-repeat, but I can't.
I have 3 tables:
create_table "events", force: :cascade do |t|
t.string "title"
t.text "description"
t.time "hour"
t.integer "duration"
t.date "date"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.float "latitude"
t.float "longitude"
t.string "formatted_addres"
t.integer "location_id"
end
create_table "taggings", force: :cascade do |t|
t.integer "event_id"
t.integer "tag_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "taggings", ["event_id"], name: "index_taggings_on_event_id"
add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id"
create_table "tags", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "tags", ["name"], name: "index_tags_on_name"
and I am using ng-repeat to show the events
controller code:
app.controller('eventController', ['$http', function($http){
var store = this;
store.events = [];
$http.get('/events.json').success(function(data){
store.events = data;
});
}]);
The html code:
<section ng-repeat="event in eventShow.events | orderBy:'date'">
<div class="panel panel-default single-event">
<div class="panel-heading">
<h3>
{{event.title}}
<em class="pull-right">Created by user: {{event.user_id}}</em>
</h3>
</div>
<div class="panel-body">
Description:<br>{{event.description}} <br>
<em class="pull-right">{{event.date | date:'dd-MM-yyyy' }} - {{event.hour | date:"H:mm"}}</em> <br>
{{event.duration}} minutes <br>
{{ event.tags }}
</div>
</div>
</section>
Everything works, but when I try tho show the tags on the ng-repeat like {{ event.tags.name }} it doesn't show anything.
In rails works a similar sintaxis, but I see in angular it must be done in a different way. I was searching information about it yesterday and today and I did not find anything. Anybody can help? Thanks!
This is the data of my controller:
# GET /events
# GET /events.json
def index
#events = Event.all
binding.pry
respond_to do |format|
format.html { render :index }
format.json { render json: #events }
end
end
If I do a binding.pry I can do #events.first.tags and I see al tags of this event, so in ruby code I can do
<ul>
<% #events.each do |event| %>
<li><%= event.tags %></li>
<% end %>
</ul>
And this is what I can't do with angular {{ event.tags }} the json response that I get from get /events.json is like this
[
{
"id": 18,
"title": "awesome event",
"description": "incredible description",
"hour": "2000-01-01T11:12:00.000Z",
"duration": 12,
"date": "2015-11-25",
"user_id": 1,
"created_at": "2015-11-26T11:57:03.433Z",
"updated_at": "2015-11-26T11:57:03.433Z",
"latitude": 42.5767239,
"longitude": 3.4435419,
"formatted_addres": "somewhere",
"location_id": null
}
]
and if I use the debugger, obviously I only see the fields that are in the json with the ng-repat. But I need to list the items in the column of another table ralated like I do in rails.
I'm using:
Rails 4.2.5
Ruby 2.2.1p85 (2015-02-26 revision 49769)
please be patient with me I'm sill learning angular
Try by change controller code:
app.controller('eventController', ['$scope', '$http', function($scope, $http){
$http.get('/events.json').success(function(data){
$scope.events = data;
});
}]);
Change your html with events scope
<section ng-repeat="event in events | orderBy:'date'">
for your reference about $scope in angularjs
Update:
create file => app/views/events/index.json.jbuilder
json.array! #events do |event|
json.(event, :id, :title, :description, :hour, :duration, :date, :user_id, :latitude, :longitude, :formatted_addres, :location_id)
json.tags event.tags
end
# change in controller:
def index
#events = Event.all
binding.pry
respond_to do |format|
format.html
format.json
end
end
In order to bind some variable in UI you need to bind it to $scope first. So try using $scope.store instead var store.
Inject $scope in dependencies.

How should i show monthly generated tickets through chartkick

I am using rails 4, and I want to show monthly ticket generated through pie charts. Can anybody help?
Schema:
create_table "tickets", force: :cascade do |t|
t.integer "store_id"
t.integer "vendor_id"
t.datetime "ticket_date"
t.datetime "deadline"
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "ticket_no"
t.string "vendor_name"
t.string "user_id"
t.integer "issue_id"
t.integer "category_id"
t.boolean "completed", default: false
end
My ticket.rb contains:
def self.category_count(user,category)
if user.vendor.nil?
category.tickets.where('store_id = ?', user.store.id)
else
category.tickets.where('vendor_id = ?', user.vendor.id)
end
end
def self.ticket_count(user,ticket)
if user.vendor.nil?
ticket.tickets.where('store_id = ?', user.store.id)
else
ticket.tickets.where('vendor_id = ?', user.vendor.id)
end
end
view:
tickets:
index.html.erb file is:
<% data = {} %>
<% for category in Category.all %>
<% data[:"#{category.name}"] = Ticket.category_count(current_user,category).count %>
<% end %>
<%= pie_chart(data) %>
I would probably start by moving this into a view helper method such as:
def pie_chart_data(user)
Hash[*Category.all.map { |c| [c.name, Ticket.category_count(user, c).count] }]
end
You could then call this in your view
<%= pie_chart(pie_chart_data(current_user)) %>

Ruby on Rails Devise user

I am new to ruby on rails. I am originally a PHP/mysql programmer. I can not seem to understand how you connect any posts to the user and display them (e.g. a post is successfully created with the user ID and then the users ID is queried to get his or her name.)
I am using devise for authentication.
Controller
def create
poll = current_user.polls.build(params[:poll])
poll.onefourty = poll.onefourty[0..140]
poll.created_at = Time.now
poll.save!
if #poll.save
redirect_to root_path
else
redirect_to root_path
end
end
Form
<%= form_for Poll.new, :html => { :multipart => true } do |f| %>
<div id="form">
<div class="text_input" style="height: 65px;"><%= f.text_area :onefourty %><div class="label" style="height: 63px; line-height: 63px;">Question</div></div>
<div class="text_input"><%= f.text_field :option1 %><div class="label">Option One</div></div>
<div class="text_input"><%= f.text_field :option2 %><div class="label">Option Two</div></div>
<div class="text_input"><%= f.text_field :option3 %><div class="label">Option Three</div></div>
<div class="text_input"><%= f.text_field :option4 %><div class="label">Option Four</div></div>
<div id="submit">
<div id="left">
</div>
<%= f.submit :id => "next", :value => "" %>
</div>
</div>
<% end %>
Migrations:
create_table "polls", :force => true do |t|
t.text "onefourty"
t.string "option1"
t.string "option2"
t.string "option3"
t.string "option4"
t.string "option5"
t.string "option6"
t.datetime "created_at"
t.datetime "updated_at"
t.string "photo1_file_name"
t.string "photo1_content_type"
t.integer "photo1_file_size"
t.datetime "photo1_updated_at"
t.string "photo2_file_name"
t.string "photo2_content_type"
t.integer "photo2_file_size"
t.datetime "photo2_updated_at"
t.string "photo3_file_name"
t.string "photo3_content_type"
t.integer "photo3_file_size"
t.datetime "photo3_updated_at"
t.string "photo4_file_name"
t.string "photo4_content_type"
t.integer "photo4_file_size"
t.datetime "photo4_updated_at"
end
create_table "users", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "encrypted_password", :limit => 128, :default => "", :null => false
t.string "password_salt", :default => "", :null => false
t.string "confirmation_token"
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.string "reset_password_token"
t.string "remember_token"
t.datetime "remember_created_at"
t.integer "sign_in_count", :default => 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "username"
t.string "firstname"
t.string "lastname"
t.string "avatar_file_name"
t.string "avatar_content_type"
t.integer "avatar_file_size"
t.datetime "avatar_updated_at"
end
Assuming you have the following structure:
# app/model/user.rb
class User < ActiveRecord::Base
has_many :polls
#...
end
# app/model/poll.rb
class Poll < ActiveRecord::Base
belongs_to :user
#...
end
And if you're successfully creating polls, which it appears you probably are, then in any view - you could query and display the current user's polls with:
# app/views/polls/index.html.erb
<%- if current_user -%>
<%- current_user.polls.each do |poll| -%>
<h2><%= poll.onefourty %></h2>
<ul>
<li><%= poll.option1 %></li>
<li><%= poll.option2 %></li>
<li><%= poll.option3 %></li>
<li><%= poll.option4 %></li>
<li><%= poll.option5 %></li>
<li><%= poll.option6 %></li>
</ul>
<%- end -%>
<%- else -%>
<em>Not logged in</em>
<%- end -%>

Resources