Ransack showing all instead of filter - ruby-on-rails

I am trying to use Ransack gem but it returns all 12,000 rows instead of using the filter.
Controller:
def list
#q = LmiHost.ransack(params[:q])
if !(params[:commit].nil?) then
#computers = #q.result
else
#computers = LmiHost.where(:job_id => 121)
end
end
View:
<script type="text/javascript">
$(document).ready(function() {
$("#computer_search_results").dataTable();
});
</script>
<table id="computer_search_table">
<%= search_form_for #q do |f| %>
<tr><td>Project:</td><td><%= f.select :job_id, #project_job_selector %></td></tr>
<tr><td><%= f.submit 'Search' %></td></tr>
<%end%>
</table>
<table id="computer_search_results">
<thead>
<tr>
<th>Lmi Name</th>
<th>Service Tag</th>
<th>Model</th>
<th>Ship Date</th>
<th>Warranty Date</th>
<th>Project</th>
<th>Invoice Name</th>
</tr>
</thead>
<tbody>
<% #computers.each do |computer| %>
<tr>
<td><%= computer.host_description %></td>
<td><%= computer.host_service_tag %></td>
<td><%= computer.host_model %></td>
<td><%= computer.ship_date %></td>
<td><%= computer.warranty_date %></td>
<td><%= computer.job.name unless computer.job.nil? %></td>
<td><%= computer.invoice_name %></td>
</tr>
<% end %>
</tbody>
</table>
the URL looks okay after seraching:
URL
But it is acting like :
#computers = LmiHost.all
Any ideas as too why this is happening?

What you are doing wrong is that you are not specifying a proper matcher. if you want to select particular job id you should indicate the search matcher in the form.
for example you are saying job_id where it should be job_id_eq or what ever matcher you want it to be
where you should getter a Ransack Search item like following.
Ransack::Search<class: LmiHost, base: Grouping <conditions: [Condition <attributes: ["job_id"], predicate: eq, values: ["123"]>], combinator: and>>
in your Ransack search I don't see the predicate hence it returns all the resutls.

Related

Rails looping through params data

I am parsing an excel file and passing the data to my controller but I cannot seem to loop through it in my view:
Params:
Parameters: {"data"=>{"consult_charges"=>[{"id"=>"17474", "item"=>"Consultation", "name"=>"Ramon", "price"=>"25.0"}, {"id"=>"17584", "item"=>"Consultation", "name"=>"Ramon", "price"=>"25.0"}, {"id"=>"17490", "item"=>"Consultation", "name"=>"Elizabeth", "price"=>"25.0"}, {"id"=>"17515", "item"=>"Consultation", "name"=>"Elizabeth", "price"=>"25.0"}, {"id"=>"17554", "item"=>"Consultation", "name"=>" Elizabeth", "price"=>"25.0"}, {"id"=>"17623", "item"=>"Consult - Referral Card", "name"=>"Elizabeth", "price"=>"0.0"}, {"id"=>"17486", "item"=>"Consultation", "name"=>"Racha", "price"=>"25.0"}
Controller:
#consult_charges = params["data"]["consult_charges"]
View:
<table class="table awaken">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<% #consult_charges.each do |sale| %>
<td><%= sale["id"] %></td>
<td><%= sale["name"] %></td>
<td><%= sale["item"] %></td>
<td><%= sale["price"] %></td>
<% end -%>
</tbody>
</table>
The result is a single line of data as if there is only one sale. When I look at the value for #consult_charges it's an array of items like this:
<ActionController::Parameters {"id"=>"17584", "item"=>"Consultation", "name"=>"Ramon", "price"=>"25.0"} permitted: false>
Do I need to do something to convert the type?
The reason it's showing just one line is because <tr> tag is missing on each iteration. Change your view to;
<table class="table awaken">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<% #consult_charges.each do |sale| %>
<tr>
<td><%= sale["id"] %></td>
<td><%= sale["name"] %></td>
<td><%= sale["item"] %></td>
<td><%= sale["price"] %></td>
</tr>
<% end -%>
</tbody>
</table>

rails update with checkbox

I want in my restaurant application to change the status of "preparated" to "deliverated" with a checkbox list but when doing the reload of the view where it does not make any changes, and logically the query is well I do not understand which is the problem.
View of the application
Orderdish.rb
class Orderdish < ApplicationRecord
belongs_to :order
belongs_to :dish
def self.orders_waiter waiter
orders_waiter=Orderdish.all.joins({:order => :table},:dish).select("orderdishes.*,orderdishes.state as status,orderdishes.id as id, dishes.*, dishes.speciality_id as speciality_id, tables.*, orders.*, orders.created_at as order_created, tables.*, tables.waiter_id as waiter_id").where("waiter_id = ?", waiter.id).where("orderdishes.state = ?", "preparated").order("order_created ASC")
return orders_waiter
end
end
Controller
def orderWaiter
#ordersWaiter = Orderdish.orders_waiter current_waiter
#ordersWaiter = #ordersWaiter.paginate(:page => 1, :per_page => 12)
end
def deliverated
puts Orderdish.where(id: params[:orderdishes_ids]).update_all state: "deliverated"
redirect_to :orderWaiter
end
Routes
resources :order_views do
collection do
put :preparated
put :deliverated
end
end
get 'orderWaiter' => 'order_views#orderWaiter'
View
<div class="aboutUs">
<%= form_tag deliverated_order_views_path, method: :put do %>
<table class="table table-inverse">
<thead>
<tr>
<th> </th>
<th>Created </th>
<th>Table </th>
<th>Name</th>
<th>Specification</th>
<th>Quantity</th>
<th>State</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% #ordersWaiter.each do |orderwaiter| %>
<tr>
<td><%= check_box_tag "orderdishes_ids[]", orderwaiter.id %></td>
<td><%= orderwaiter.order_created.to_time.strftime('%B %e at %l:%M %p') %></td>
<td><%= orderwaiter.number %></td>
<td><%= orderwaiter.name %></td>
<td><%= orderwaiter.specification %></td>
<td><%= orderwaiter.quantity %></td>
<td><%= orderwaiter.status %></td>
</tr>
<% end %>
</tbody>
</table>
<%= submit_tag "Deliverated" %>
</div>
<% end %>

how to render view/index in another view/index?

I dont understand how to insert code into my welcome/index.html.erb file. Here is my code:
Welcomes_controller.rb
def index
#welcomes = Welcome.all
end
Schedules_controller.rb
def index
#schedules = Schedule.all
end
schedules/index.html.erb
<table class="table table-hover">
<thead>
<tr>
<th>Время<br>отправления</th>
<th>Город</th>
<th>Место<br> отправления</th>
<th>Время <br>прибытия</th>
</tr>
</thead>
<tbody>
<% #schedules.each do |s| %>
<tr>
<td><%= s.deptime %></td>
<td><%= s.city %></td>
<td><%= s.street %></td>
<td><%= s.aparttime %></td>
</tr>
<% end %>
</tbody>
</table>
How do I insert that code into welcome/index.html.erb?
To render the schedules index template from the welcomes_controller.rb
def index
#welcomes = Welcome.all
render "/schedules/index"
end
However, this will present a problem because the table in the view depends on an #schedules instance variable to be set and it will return nil because it is not assigned a value in the controller.
you might want to do this:
def index
#schedules = Welcome.all
render "/schedules/index"
end
Which does not really make sense to me from a semantic point of view. You might want to rename the instance variable to something more model agnostic.
In the other answer it was suggested to use a partial. That could actually be a better solution depending on the use case.
create a partial app/views/shared/_index_table.html.erb with the content
<table class="table table-hover">
<thead>
<tr>
<th>Время<br>отправления</th>
<th>Город</th>
<th>Место<br> отправления</th>
<th>Время <br>прибытия</th>
</tr>
</thead>
<tbody>
<% schedules.each do |s| %>
<tr>
<td><%= s.deptime %></td>
<td><%= s.city %></td>
<td><%= s.street %></td>
<td><%= s.aparttime %></td>
</tr>
<% end %>
</tbody>
</table>
Then, app/views/schedules/index.html.erb
<h1>Schedules</h1>
<%= render partial: "shared/index_table", :locals => { schedules: #welcomes } %>
and app/views/welcomes/index.html.erb
<h1>Welcome</h1>
<%= render partial: "shared/index_table", :locals => { schedules: #schedules } %>
This works only if you have the same set of attributes (deptime, city, street, aparttime) on both Welcome and Schedule models

Ruby display array values

I am not a ruby developer. This is the first time I am looking into the code. I want to build a dynamic table for which I have managed below code. However, I am not able to display all the contents of the array except for the first and the last values. How do I display all the values?
Thanks for your help!!
<style>table, td, th{border:1px solid white;}td{padding:5px;}th{background-color:#E0E6EB;color:black;}</style>
<div>
<table border=2>
<tr>
<th width="250px"><B><p style="text-align: center">Name</p></B></th>
<th width="120px"><B><p style="text-align: center">Number</p></B></th>
<th width="60px"><B><p style="text-align: center">Status</p></B></th>
<th width="155px"><B><p style="text-align: center">Product Type</p></B></th>
<th width="60px"><B><p style="text-align: center">Source</p></B></th>
</tr>
<% tempTickets = #subject.PersonAccounts.sorted_by(field("title").in_descending_order) %>
<% cnt = tempTickets.length %>
<% tempTickets.each do |ticket| %>
<div>
<tr>
<td><%= ticket['perfinaccnt-accountname'].first %></td>
<td><%= ticket['perfinaccnt-accountnumber'].first %></td>
<td><%= ticket['perfinaccnt-accountstatus'].first %></td>
<td><%= ticket['perfinaccnt-producttype'].first %></td>
<td><%= ticket['perfinaccnt-accountsrcsystem'].first %></td>
</tr>
</div>
<div>
<tr>
<td><%= ticket['perfinaccnt-accountname'].last %></td>
<td><%= ticket['perfinaccnt-accountnumber'].last %></td>
<td><%= ticket['perfinaccnt-accountstatus'].last %></td>
<td><%= ticket['perfinaccnt-producttype'].last %></td>
<td><%= ticket['perfinaccnt-accountsrcsystem'].last %></td>
</tr>
</div>
<% end %>
</table>
</div>
You could do it with three nested loops:
<%= tempTickets.each do |ticket|
[
'perfinaccnt-accountname',
'perfinaccnt-accountnumber',
'perfinaccnt-accountstatus',
'perfinaccnt-producttype',
'perfinaccnt-accountsrcsystem'
].each do |f|
ticket[f].each do |tf|
puts "<td>tf</td>";
end if ticket[f]
end
end %>
I'm not sure about the data structure here but you could check it by doing an #inspect to tempTickets and all the subsequent objects. From the looks of it "ticket['perfinaccnt-accountname']" is actually an array
and as such you can just loop through it. Not the fastest way to do it but it should work to just do a nested loop.
<style>table, td, th{border:1px solid white;}td{padding:5px;}th{background-color:#E0E6EB;color:black;}</style>
<div>
<table border=2>
<tr>
<th width="250px"><B><p style="text-align: center">Name</p></B></th>
<th width="120px"><B><p style="text-align: center">Number</p></B></th>
<th width="60px"><B><p style="text-align: center">Status</p></B></th>
<th width="155px"><B><p style="text-align: center">Product Type</p></B></th>
<th width="60px"><B><p style="text-align: center">Source</p></B></th>
</tr>
<% tempTickets = #subject.PersonAccounts.sorted_by(field("title").in_descending_order) %>
<% cnt = tempTickets.length %>
<% tempTickets.each do |ticket| %>
<div><tr>
<% ticket.each do |k,v|
v.each do |col| %>
<td><%= col %></td>
<% end %>
<% end %>
</tr></div>
<% end %>
</table>
</div>

Rails create new records based on checked records

I have a table showing time entries (events) related to a workorder.
The user can enter a check on any of the table rows.
For each checked row, I want to create a new record in the invtime table.
invtime belongs_to :event
event has_many :invtimes
This is the table:
<table>
<thead>
<tr>
<th>Title</th>
<th>Employee</th>
<th>Date</th>
<th>Hours</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<% Event.where("workorder_id = ?", Invoice.find(#invoice).workorder_id).where("billed = ?", false).each do |event| %>
<tr>
<td><%= check_box_tag(:add_record) %></td>
<td><%= event.title %></td>
<td><%= event.employee.employee_full_name %></td>
<td><%= event.starts_at.strftime("%m/%d/%Y") %></td>
<td><%= event.hours %></td>
<td></td>
</tr>
<% end %>
</tbody>
</table>
I'm not sure how to process the returned page with the checkboxes checked.
Should I use Javascript (coffeescript)? Or can I do it with Ruby?
This should do it:
<tbody>
<%= form_tag(your_path_helper) do %>
<% Event.where("workorder_id = ?", Invoice.find(#invoice).workorder_id).where("billed = ?", false).each do |event| %>
<tr>
<td><%= check_box_tag 'event_ids_to_save[]', value: event.id, checked: Invtime.exists?(event_id: event.id) %></td>
<td><%= event.title %></td>
<td><%= event.employee.employee_full_name %></td>
<td><%= event.starts_at.strftime("%m/%d/%Y") %></td>
<td><%= event.hours %></td>
<td></td>
</tr>
<% end %>
<tr><td colspan='6'><%= submit_tag %></td></tr>
<% end %>
</tbody>
The corresponding action of the controller responding to the form_tag submit:
def action_of_the_form_tag
params[:event_ids_to_save].each do |event_id|
event = Event.where(id: event_id)
# do your logic here
end
end

Resources