我有三个大括号中指定字段/列的表:
Country (name,currency_id)
Currency (name)
User (name ,country_id,currency_id)
我的要求是在创建用户选择国家时,需要首先显示默认货币,并在下一个选择行中显示剩余货币。 EX:如果我们选择美国在国家下降货币下降美元需要首先显示,剩下的货币在下一个
我的想法是用户属于任何国家/地区默认货币是他的国家/地区货币,他也可以选择其他货币。
请帮帮我。
答案 0 :(得分:0)
您知道该用户属于国家/地区且用户属于货币。您还需要country to belongs_to default_currency。
class Country
belongs_to :default_currency, :class_name => "Currency"
答案 1 :(得分:0)
我假设您在用户表单中有两个选择框:
<%= 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'));
});
});
答案 2 :(得分:-1)
User
不需要currency_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
个对象,则可以轻松更改。