0

这有效:

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

这不起作用:

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

但是,我可以从控制台运行第二个示例,它工作正常。

这是错误:

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

4

添加.firstActiveRecord::Relation对象

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

User.find_by_id(1)User模型的一个实例。

User.where(:id => 1)不是User模型,而是ActiveRecord::Relation

于 2013-07-16T04:59:35.690 回答
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指向一个用户对象,所以下面的工作。

@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没有指向用户对象,因此您无法获取与该用户相关的城市。您可以尝试以下方法。

@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

在这种情况下,如果您首先使用,那么它将仅指向数组中的第一个对象所以遍历它以覆盖所有其他用户

于 2013-07-16T05:42:53.687 回答
0

@other_users 返回用户数组而不是单个用户对象。您需要遍历所有对象以获取城市

使用地图

@users_cities = @other_users.map(&:cities) => [[city1, city 2], [city3, city4]]

如果你想要一个平面阵列,那么用户 flattern

@users_cities = @other_users.map(&:cities).flatten

另一种选择是从城市模型中选择城市,而不是通过关联。就像是

@users_cities = City.where("user_id != 1")

于 2013-07-15T20:29:48.883 回答