Rails 3 - 选择包含?

时间:2010-10-28 23:06:09

标签: ruby-on-rails ruby-on-rails-3 activerecord select include

以下是包含include:

的嵌套选择
@items = Item.where("complete = ?", true).includes( :manufacturer, {:order=>[:supplier, :agent] })

这是一个征税查询,因为它从所有上述表中提取了1000行数据。

如何才能让查询只选择特定字段?

  • user.name,user.created_at
  • order.created_at
  • supplier.name
  • agent.name
  • manufacturer.name

4 个答案:

答案 0 :(得分:32)

ARel中有一个select方法,但你必须使用正确的表名(即复数,如果你有多态模型或者你使用的是set_table_name或其他类似的非标准做法,请注意)

@items = Item.
  select('users.name', 'users.created_at', 'orders.created_at', 'suppliers.name', 'agents.name', 'manufacturers.name').
  where(:users => { :fulfilled => true }).
  includes(:orders => [:supplier, :agent], :manufacturer)

“我们可以使用select with joins not includes” - @Bhavesh_A_P

注意:

正如上面指出的@Bhavesh_A_P,selectincludes不会产生一致的行为。看来如果包含的关联没有返回结果,select将正常工作,如果返回结果,则select语句将不起作用。实际上,它将被完全忽略,因此您的select语句可能引用无效的表名,并且不会产生错误。 selectjoins会产生一致的行为。

答案 1 :(得分:17)

实际上我们不能使用select with includes。它只能与连接一起使用。

答案 2 :(得分:5)

通过在链中包含对“select”方法的调用,问题无法解决。在我们构建的类似ActiveRecord :: Relation中,调用'includes'似乎会覆盖对'select'的任何调用。

scope :active, where("hired_on < ? AND (separated_on > ? OR separated_on IS NULL)", Time.now, Time.now )

scope :with_role, lambda {|roles| includes(:team_member_roles).where(:team_member_roles => {:role => roles } ) }

scope :with_site_code, lambda {|site_codes| includes(:team_member_sites).where(:team_member_sites => {:site_code => site_codes } ) }

TeamMember.select("team_members.email, team_members.first_name, team_members.last_name").active.with_site_code(params[:site_code]).with_role(["senior_editing", "senior_and_reg_editing"]) 

如图所示,查询选择所有列。

当2个范围使用“连接”而不是“包含”时,查询有效:仅选择3个指定的列。

答案 3 :(得分:0)

Item.where("fulfilled = ?", true)
    .includes({:orders =>[:suppliers, :agents]}, :manufacturers)
    .select("users.name, users.created_at, orders.created_at, suppliers.name, agents.name").
    .order('orders.created_at DESC')