显示国家选择货币

时间:2013-03-01 17:08:20

标签: ruby-on-rails ruby

我有三个大括号中指定字段/列的表:

Country (name,currency_id)
Currency (name)
User (name ,country_id,currency_id)

我的要求是在创建用户选择国家时,需要首先显示默认货币,并在下一个选择行中显示剩余货币。 EX:如果我们选择美国在国家下降货币下降美元需要首先显示,剩下的货币在下一个

我的想法是用户属于任何国家/地区默认货币是他的国家/地区货币,他也可以选择其他货币。

请帮帮我。

3 个答案:

答案 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个对象,则可以轻松更改。