在rails中加入中选择关联的属性

时间:2016-03-03 10:24:58

标签: ruby-on-rails ruby join activerecord left-join

应用程序/模型/ user.rb

has_one :user_detail

应用程序/模型/ user_detail.rb     belongs_to:user

当我查询

User.active.
  select('users.id, users.first_name, users.last_name,user_details.unit_number').
  joins('LEFT JOIN user_details ON users.id = user_details.user_id').
  where(:property_id => params[:id])

它只提供用户模型列,而不是user_details.unit_number。我怎么得到这个?

我这样做

users = User.active.select('users.id, users.first_name, users.last_name, user_details.unit_number').joins('LEFT JOIN user_details ON users.id = user_details.user_id').where(:property_id => params[:id])

users_list = users.as_json(:only => [:id, :first_name, :last_name, :unit_number)

2 个答案:

答案 0 :(得分:2)

使用select,您已经删除了ActiveRecord对象,尤其是它们已不再与您的user_detail

有关系

您可以在user_detail声明

中使用user,在as个对象中提供select attributs
User.active.
  select('users.id, users.first_name, users.last_name, user_details.unit_number as unit_number').
  joins('LEFT JOIN user_details ON users.id = user_details.user_id').
  where(:property_id => params[:id])

然后你应该能够访问信息,就像它是用户的正常属性(而不是user_detail)

答案 1 :(得分:0)

我会使用内置的Rails工具(在这种情况下为includes):

users = User.active.includes(:user_detail).where(property_id: params[:id])

现在你可以打电话,例如:

users.first.user_detail.unit_number

并保证您没有N + 1问题