Mysql AJAX资源的复杂活动记录查询
我有一个用于国家/地区的选择字段,第二个用于给定国家/地区的装运选项的选择字段,当选择了第一个国家/地区和第二个装运时,我希望显示装运成本 当我第一次使用show加载shippingservices资源时,shippingservices资源仅正确映射到第一个国家/地区特定权重的服务和所选国家/地区,但当我对ajax资源的update_shipping操作使用相同的查询时,我得到postzones.land_id=NULL 我的控制器:Mysql AJAX资源的复杂活动记录查询,mysql,ruby-on-rails,ruby-on-rails-3,activerecord,rails-activerecord,Mysql,Ruby On Rails,Ruby On Rails 3,Activerecord,Rails Activerecord,我有一个用于国家/地区的选择字段,第二个用于给定国家/地区的装运选项的选择字段,当选择了第一个国家/地区和第二个装运时,我希望显示装运成本 当我第一次使用show加载shippingservices资源时,shippingservices资源仅正确映射到第一个国家/地区特定权重的服务和所选国家/地区,但当我对ajax资源的update_shipping操作使用相同的查询时,我得到postzones.land_id=NULL 我的控制器: class CartsController < Ap
class CartsController < ApplicationController
def show
@cart = Cart.find(params[:id])
@shippingservices = @cart.available_shipping_services.includes(:lands, :postzones).where('postzones.land_id = ?', Land.first.id)
end
def update_shipping
@cart = Cart.find(params[:id])
@shippingservices = @cart.available_shipping_services.includes(:lands, :postzones).where('postzones.land_id = ?', params[:land_id])
respond_to do |format|
format.js
end
end
end
app/views/carts/update_shipping.js.erb是:
$("#shippingservices_select").empty()
.append("<%= escape_javascript(render(:partial => @shippingservices)) %>")
carts_控制器的显示页面显示当前装运车。carts模型通过carts_项目了解其重量。这允许我在模型中计算购物车的总重量,并在模型中进行查询,从而生成可用的装运服务,我在显示页面中使用该服务成功创建第一次装载,其中第一次输入显示所有可用的解决方案,但之后的每一次更改都会导致第二个选择器表单无效
{:action=>update_shipping}可能是错误的,以后必须更改为另一个操作,该操作应显示生成的装运成本,但目前我的重点是让两个select字段正常工作
又是唐斯 params[:land_id]为空,因为您尚未将其传递给URL。您可能希望将其作为查询参数GET/carts/update_shipping/2?land_id=4传递,或者更好地将其传递到POST请求的正文中,例如使用远程表单传递它@谢谢。我明天要做这件事,我会回来报告的。我通常的程序在这里不起作用。当我需要加载与给定资源相关的图像时,我通常使用@image=image.findparams[:id]之类的东西,但这里有些东西不起作用。我可以使用“@shippingservices=@cart.available\u shipping\u services.includes:lands,:postzones.where'postzones.land\u id=?”,params[:id]“这是我一开始的想法,但不知怎么的,我第二次尝试时,它确实起了作用。
$(document).on("change", "#lands_select", function(event){
$.ajax({
url: "/carts/update_shipping/" + event.target.value,
type: "GET"
})
});
$("#shippingservices_select").empty()
.append("<%= escape_javascript(render(:partial => @shippingservices)) %>")
<option value="<%= shippingservice.id %>"><%= shippingservice.name.titleize %></option>
Started GET "/carts/update_shipping/2" for 127.0.0.1 at Tue Dec 18 14:17:21 +0100 2018
Processing by CartsController#update_shipping as */*
Parameters: {"id"=>"2"}
Cart Load (0.4ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = ? LIMIT 1 [["id", 5]]
Cart Load (0.2ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = ? LIMIT 1 [["id", "2"]]
CartItem Load (0.4ms) SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 2
SQL (0.9ms) SELECT `shippingservices`.`id` AS t0_r0, `shippingservices`.`serviceID` AS t0_r1, `shippingservices`.`title` AS t0_r2, `shippingservices`.`name` AS t0_r3, `shippingservices`.`shippingcarrier` AS t0_r4, `shippingservices`.`length` AS t0_r5, `shippingservices`.`width` AS t0_r6, `shippingservices`.`height` AS t0_r7, `shippingservices`.`weightmin` AS t0_r8, `shippingservices`.`weightmax` AS t0_r9, `shippingservices`.`price` AS t0_r10, `shippingservices`.`created_at` AS t0_r11, `shippingservices`.`updated_at` AS t0_r12, `lands`.`id` AS t1_r0, `lands`.`name` AS t1_r1, `lands`.`partof` AS t1_r2, `lands`.`continent` AS t1_r3, `lands`.`area` AS t1_r4, `lands`.`CallingCode` AS t1_r5, `lands`.`ISOcode2` AS t1_r6, `lands`.`ISOcode3` AS t1_r7, `lands`.`created_at` AS t1_r8, `lands`.`updated_at` AS t1_r9, `postzones_shippingservices`.`id` AS t2_r0, `postzones_shippingservices`.`land_id` AS t2_r1, `postzones_shippingservices`.`shippingservicezone` AS t2_r2, `postzones_shippingservices`.`shippingservice_id` AS t2_r3, `postzones_shippingservices`.`created_at` AS t2_r4, `postzones_shippingservices`.`updated_at` AS t2_r5 FROM `shippingservices` LEFT OUTER JOIN `postzones` ON `postzones`.`shippingservice_id` = `shippingservices`.`id` LEFT OUTER JOIN `lands` ON `lands`.`id` = `postzones`.`land_id` LEFT OUTER JOIN `postzones` `postzones_shippingservices` ON `postzones_shippingservices`.`shippingservice_id` = `shippingservices`.`id` WHERE (weightmin <= 0 and weightmax >= 0) AND (shippingservices.shippingcarrier = 'Poste italiane') AND (postzones.land_id = NULL)
Rendered collection (0.0ms)
Rendered carts/update_shipping.js (3.2ms)
Completed 200 OK in 13ms (Views: 7.6ms | ActiveRecord: 1.8ms)
<%= form_for :cart, :url => {:action => "update_shipping"}, :html => { :method => "get", :remote => true } do |f| %>
<%= f.select(:land_id, options_for_select(@lands.collect { |l| [l.name, l.id]}, 0), {}, {:prompt => "select a country", :id => 'lands_select'}) %><br>
<%= f.select(:shippingservice_id, options_for_select(@shippingservices.collect { |s| [s.title.titleize, s.id] }, 0), {}, {:id => 'shippingservices_select', :prompt => "select a carrier"}) %><br>
<%= f.submit "Calculate shipping" %><br>
<% end %>