Rails 3 – select包含?

这是一个嵌套select与包括:

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

这是一个征税查询,因为它从所有上面包含的表中抽取1000行数据。

我怎样才能得到查询只select特定的领域?

  • user.name,user.created_at
  • order.created_at
  • 供应商名称
  • 代理名称
  • 生产商名称

在ARel中有一个select方法,但是你必须使用正确的表名(例如复数forms,小心如果你有多态模型,或者你使用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” – @Bhavesh_A_P

注意:

正如@Bhavesh_A_P所指出的那样, selectincludes不会产生一致的行为。 看来如果包含的关联没有返回任何结果, select会正常工作,如果返回结果,select语句将不起作用。 事实上,它将被完全忽略,这样你的select语句就可以引用无效的表名而不会产生错误。 select joins会产生一致的行为。

其实我们不能使用select来包含。 它只能用于连接。

通过在链中包含对“select”方法的调用,问题不解决。 在我们构build的类似的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"]) 

如图所示,查询select所有列。

当2个作用域使用“连接”而不是“包含”时,查询将起作用:只有3个指定的列被选中。

 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')