1

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

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

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

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

请帮帮我。

4

3 回答 3

0

你知道用户属于国家,用户属于货币。您还需要国家到 belongs_to default_currency。

class Country
  belongs_to :default_currency, :class_name => "Currency"
于 2013-03-01T17:14:47.200 回答
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'));
  });
});
于 2013-03-01T19:25:46.807 回答
-1

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对象本身,您可以轻松更改它。

于 2013-03-01T17:14:54.147 回答