【问题标题】:Select associated attributes in join in rails在加入rails中选择关联的属性
【发布时间】:2016-06-16 14:49:53
【问题描述】:

app/models/user.rb

has_one :user_detail

app/models/user_detail.rb 属于_to:用户

当我查询时

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)

【问题讨论】:

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


    【解决方案1】:

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

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

    现在你可以调用,例如:

    users.first.user_detail.unit_number
    

    保证你没有 N + 1 个问题

    【讨论】:

    • 但是建议在where子句中不要使用include。
    • 推荐在哪里?
    • @MarekLipka 就在这里guides.rubyonrails.org/… 所以在这种情况下使用它更好User.joins(:user_detail).where(user_detail: { property_id: params[:id]})
    【解决方案2】:

    通过使用select,您已经剥离了ActiveRecord 对象,尤其是它们不再与您的user_detail 有关系

    您可以通过在select 语句中使用as 使user_detail 属性在您的user 对象中可用

    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)

    【讨论】:

    • 但是我想要它的结果。有这种可能吗?
    • 请澄清“在结果中”的含义。您如何使用查询?
    • 意思是我想在第一个查询中获取所有 user_details.unit_number
    • 你是如何使用查询的?因为似乎有些东西你还没有理解。
    • 那么查询应该可以工作,我只是不确定 users.as_json() 是否会包含“new” unit_number 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多