Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 阿雷尔,怎么加入_Ruby On Rails_Ruby_Ruby On Rails 3_Arel - Fatal编程技术网

Ruby on rails 阿雷尔,怎么加入

Ruby on rails 阿雷尔,怎么加入,ruby-on-rails,ruby,ruby-on-rails-3,arel,Ruby On Rails,Ruby,Ruby On Rails 3,Arel,给定 类别“名称ASC” 结束 使用Rails 3堆栈,如何查询“拥有”产品的所有类别?Category.joins(:products)。选择(“distinct categories.*)。全部 在ARel(非ActiveRecord)中,我们将执行以下操作: class Category < ActiveRecord::Base has_many :products, :order => 'name ASC' end 另一种更简单的方法是将ActiveRecord查询接

给定

类别“名称ASC”
结束
使用Rails 3堆栈,如何查询“拥有”产品的所有类别?

Category.joins(:products)。选择(“distinct categories.*)。全部
在ARel(非ActiveRecord)中,我们将执行以下操作:

class Category < ActiveRecord::Base
  has_many :products, :order => 'name ASC'
end

另一种更简单的方法是将ActiveRecord查询接口的
join
与ARel一起用于条件语句:

p = Arel::Table.new :products    # Base Rel-var
c = Arel::Table.new :categories  # Base Rel-var

predicate = p[:category_id].eq( c[:id] ) # for equality predicate

p.join(c)                   # Natural join
  .on( predicate )          # Equi-Join
  .group( p[:category_id] ) # Grouping expression to get distinct categories
  .project( c[:id] )        # Project the distinct category IDs of the derived set.
在sqlite3中生成以下sql:

joins(:user)
.where(User.arel_table[:name].matches("%#{query}%"))
以及postgres中的以下sql(注意ILIKE):


这使您可以简单地加入,但仍然可以将ARel matcher的抽象化添加到您的RDBMS中。

您是否知道有关ARel查询的一个很好的参考资料?我从谷歌、阅读Rails精英博客中获得了我的知识。重要事项:ActiveRecord与纯Arel有很大不同。当你说“在Arel(非ActiveRecord)中”,你的确切意思是什么?我们不能在从
ActiveRecord::Base
派生的类中执行此操作?在所有这些例子中,我从来没有看到将AREL查询折叠回Rails以获得真实记录的最后一步。现在如何处理p?您当然可以对其调用_sql,但如何将其转换为将加载记录的ActiveRecord::Relation?@BradGonessurfing只需将其粘贴到AR where方法中即可。ARel只生成SQL。上面是一个连接,不能停留在where方法中。对于生成SELECT(而不仅仅是where子句)的ARel,您可以使用
find\u by\u SQL(ARel\u expression.to\u SQL)
。这将返回一个记录数组,而不是一个可链接的ActiveRecord::Relation,但至少它会给出结果。
"SELECT \"patients\".* FROM \"patients\" INNER JOIN \"users\" ON \"users\".\"id\" = \"patients\".\"user_id\" WHERE (\"users\".\"name\" LIKE '%query%')"
"SELECT \"patients\".* FROM \"patients\" INNER JOIN \"users\" ON \"users\".\"id\" = \"patients\".\"user_id\" WHERE (\"users\".\"name\" ILIKE '%query%')"