我有三个带有大括号中指定字段/列的表:
Country (name,currency_id)
Currency (name)
User (name ,country_id,currency_id)
我的要求是在创建用户选择国家时,需要首先显示默认货币,然后在下一个选择行中显示剩余货币。EX:如果我们在国家下拉列表中选择美国,则需要首先显示美元,然后在下一个显示剩余货币
我的想法是用户属于任何国家默认货币是他的国家货币,他也可以选择其他货币。
请帮帮我。
我有三个带有大括号中指定字段/列的表:
Country (name,currency_id)
Currency (name)
User (name ,country_id,currency_id)
我的要求是在创建用户选择国家时,需要首先显示默认货币,然后在下一个选择行中显示剩余货币。EX:如果我们在国家下拉列表中选择美国,则需要首先显示美元,然后在下一个显示剩余货币
我的想法是用户属于任何国家默认货币是他的国家货币,他也可以选择其他货币。
请帮帮我。
你知道用户属于国家,用户属于货币。您还需要国家到 belongs_to default_currency。
class Country
belongs_to :default_currency, :class_name => "Currency"
我假设,您在用户表单中有两个选择框:
<%= f.select :country_id, options_for_select(@countries.map{ |c| [c.name, c.id, {'data-currency'=>c.currency.id}] }), {}, :id => 'user_country' %>
<%= f.collection_select :currency_id, @currencies, :id, :name, {}, :id => 'user_currency'%>
国家选择将具有带有额外属性的选项data-currency
,可在 jquery 中使用以查找正确的货币选项。和@countries
是@currencies
:
@countries = Country.includes(:currency).all
@currencies = Currency.all
现在在jquery中,
$(document).ready(function(){
$('#user_country').change(function(){
var currency_id = $(this).find("option:selected").data('currency'); //collects the value of `data-currency` attribute of selected country.
var currency_option = $('#user_currency').find("option[value='" + currency_id + "']"); //finds the option tag with the currency_id as value.
$('#user_currency').prepend(currency_option); //prepends the currency_option to the currency select
//the currency will be the first option now but it will not be selected by default
//to make it selected replace the last line with
//$('#user_currency').prepend(currency_option.attr('selected', 'selected'));
});
});
User
不需要 acurrency_id
因为它可以从Country
它所属的那个派生出来。您可以添加一个方法来User
以正确的顺序取回货币。
class User < ActiveRecord::Base
...
def ordered_currencies
# Set up an array of currencies, with the default one first.
default_currency = self.country.currency
currencies = [default_currency.name]
# Add in all other currencies except the default one.
Currency.where("id != ?", defauly_currency.id).each do |currency|
currencies << currency.name
end
return currencies
end
...
end
在这种情况下,我让该方法返回货币名称,但如果您想返回Currency
对象本身,您可以轻松更改它。