0

これは機能します:

@user = User.find(current_user.id)
@users_cities = @user.cities

これは動作しません:

@other_users = User.where("id != ?", 1)
@users_cities = @other_users.cities

ただし、コンソールから 2 番目の例を実行すると、問題なく動作します。

エラーは次のとおりです。

NoMethodError in CitiesController#index
undefined method `cities' for #<ActiveRecord::Relation:0x007f8f670f2870>
app/controllers/cities_controller.rb:23:in `index'

23行目はこれです:

@users_cities = @other_users.cities

モデルはhas_and_belongs_to_many :citieshas_and_belongs_to_many :userです。私はそれhas_and_belongs_to_many :userが意図されていると思っていましhas_and_belongs_to_many :usersたが、同じエラーが発生します(サーバーを再起動した後でも)。

4

3 に答える 3

1

前者の場合、 @user は userobject を指しているため、問題なく動作します。ユーザー モデルに次の属性 (id、name、created_at、updated_at) があると仮定します。

@user= User.find(current_user.id)
@user.class
 => User(id: integer, name: string, created_at: datetime, updated_at: datetime, etc)
@user
  => #<User id: 1, name: "Amar",created_at: "2013-07-10 10:07:37", updated_at: "2013-07-10 10:07:37"> 

インスタンス変数@userがuserobjectを指すようになったので、次のように動作します。

@users_cities = @user.cities 

ただし、whereの場合、それはリレーションであり、インスタンス変数は単一のレコードを持つ配列を保持します。

@user= User.where(:id => current_user.id)
@user.class
  => ActiveRecord::Relation
@user
  => [#<User id: 1, name: "Amar", created_at: "2013-07-10 10:07:37", updated_at: "2013-07-10 10:07:37">] 

ここで、 @user はuserobjectを指していないため、そのユーザーに関連付けられた都市を取得できません。以下を試すことができます。

@user= User.where(:id => current_user.id).first #first gets the first object from the array.
@user.class
 => User(id: integer, name: string, created_at: datetime, updated_at: datetime, etc)
@user
 => #<User id: 1, name: "Amar",created_at: "2013-07-10 10:07:37", updated_at: "2013-07-10 10:07:37"> 

この場合、インスタンス変数@userがfirstを使用して単一のユーザーオブジェクトを指すようにしたため、次のように動作するはずです。

@users_cities = @user.cities 

繰り返しますが、あなたは User モデルから配列を取得しています

@other_users = User.where("id != ?", 1)

要素の配列を収集します。そのため、配列を反復処理してその都市を見つける必要があります。

@other_users.each do |user|
 # do manipulation with user.cities
end

この場合、firstを使用すると、配列内の最初のオブジェクトのみを指します。したがって、それを繰り返して、他のすべてのユーザーをカバーします

于 2013-07-16T05:42:53.687 に答える