3

私はこのような現在の都市と国のモデルを持っています

# City model
city:string
country_code:string

# Country model
country:string
country_code:string

デフォルトのcountry_idを使用する代わりに、country_codeをforeign_keyとして使用して、両方のモデル間の関連付けを作成しようとしています。

# city.rb
belongs_to :country, :foreign_key => "country_code"

# country.rb
set_primary_key :country_code
has_many :cities, :foreign_key => "country_code"

このクエリは機能していません

ruby-1.9.2-p290 :016 > Country.where(:country_code => "uy").cities
NoMethodError:   Country Load (0.2ms)  SELECT "countries".* FROM "countries" WHERE     "countries"."country_code" = 'uy'
undefined method `cities' for #<ActiveRecord::Relation:0x007f8e92ca0df0>
from /Users/pel/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-    3.2.3/lib/active_record/relation/delegation.rb:45:in `method_missing'
from (irb):16
    from /Users/pel/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start'
from /Users/pel/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start'
from /Users/pel/.rvm/gems/ruby-1.9.2-p290/gems/railties-    3.2.3/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
4

1 に答える 1

3

これを試して:

Country.where(:country_code => "uy").collect(&:cities)

あなたが欠けているもの:

このエラーを確認してください:

 undefined method `cities' for #<ActiveRecord::Relation:0x007f8e92ca0df0>

ここで、条件はオブジェクトの配列を返します。例(場合によっては1つのidが存在することを考慮して)

 Country.first // will return an object or nil

 Country.find(1) // will return an object or will throw an exception

 Country.where(:id=> 1) // will return an array of only one object with id 1

そう

  Country.find(1) IS NOT EQUAL TO Country.where(:id=> 1)

しかし

 Country.find(1) IS EQUAL TO Country.where(:id=> 1).first

それは基本についてです。だから問題は

Country.where(:country_code => "uy") 

配列を返しますが、実際には存在しない配列に「都市」マッピングを適用しようとしています。したがって、あなたがする必要があるのは、その配列内のすべてのオブジェクトをループし、これらの「国」オブジェクトごとに都市を見つけて、arrayの別の配列を返す「収集」です。

もう 1 つ注目すべき点:

 Country.where(:country_code => "uy") 

次のような配列を返します。

['a','b','c','d']

しかし

Country.where(:country_code => "uy").collect(&:cities)

次のような配列を返します。

  [[1,2,3,4],[2,3,6,8],[8],[10]] ie an array of an array.

したがって、次のように平らにする必要があります。

  Country.where(:country_code => "uy").collect(&:cities).flatten

次に、一意の都市が必要な場合(必要に応じて、レコードに基づいて、この場合は必要ないと思います)、配列に .uniq を追加できます。

于 2012-04-23T20:33:47.233 に答える