前者の場合、 @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を使用すると、配列内の最初のオブジェクトのみを指します。したがって、それを繰り返して、他のすべてのユーザーをカバーします。