Rails 3 - 选择包含?

Posted

技术标签:

【中文标题】Rails 3 - 选择包含?【英文标题】:Rails 3 - select with Include? 【发布时间】:2011-05-02 03:52:36 【问题描述】:

这是一个包含包含的嵌套选择:

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

这是一个繁重的查询,因为它从上述所有包含的表中提取了 1000 行数据。

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

user.name, user.created_at order.created_at 供应商名称 代理名称 制造商名称

【问题讨论】:

【参考方案1】:

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)

“我们可以使用不包含连接的选择”-@Bhavesh_A_P

注意:

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

【讨论】:

在 3.0.6 上对我不起作用,忽略 select 子句,并获取包含表中的所有列:( 对我不起作用。我建议任何遇到此问题的人使用 joins("LEFT JOIN table_name ON id = tables.id") 例如看这篇文章:***.com/questions/4169726/rails-select-and-include @Patrick,如果我想检查他是否有这样的用户,我将如何使用它:("name like ?", "%#q%"【参考方案2】:

实际上我们不能将 select 与包含一起使用。它只能与连接一起使用。

【讨论】:

【参考方案3】:

在链中包含对“选择”方法的调用并不能解决问题。在我们构建的类似 ActiveRecord::Relation 中,调用“包含”似乎覆盖了对“选择”的任何调用。

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 个作用域使用 'joins' 而不是 'includes' 时,查询有效:只选择了 3 个指定的列。

【讨论】:

【参考方案4】:
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')

【讨论】:

以上是关于Rails 3 - 选择包含?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3包含翻译globalize3 activerecord

Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV

仅发送纯文本电子邮件,正文中包含 Rails mime 部分

Rails 资产管道:包含所有 /vendor/assets/javascripts/ 的标准方式?

如何在 Rails 3.1 中包含供应商 js

使用 Javascript/JQuery/Rails 3 动态添加新行