【问题标题】:Rails model query from sql来自 sql 的 Rails 模型查询
【发布时间】:2012-03-03 02:04:00
【问题描述】:

我正在使用 Rails 3,

我正在 Rails 中编写一个逻辑来获取与基于可标记类型的标签相关的标签。 如何从下面的 sql 中以 rails 方式编写相同的内容?

 select 
      count(t2.id), 
      t2.id,
      t2.tag_id 
 from taggings t1 
      inner join taggings t2 on (t1.taggable_id = t2.taggable_id and t1.taggable_type = t2.taggable_type ) 
 where t1.tag_id = 2 
 group by(t2.id);

编辑

我喜欢写

tag = ActsAsTaggableOn::Tag.find_by_name(params[:id])
  join_clause = 'INNER JOIN taggings as t2 ON(t1.taggable_id = t2.taggable_id and t1.taggable_type = t2.taggable_type)'
  select_clause = "DISTINCT t2.tag_id"
  from_clause = 'taggings as t1'
  where_clause = "t1.tag_id = #{tag.id} and t2.tag_id != #{tag.id}"
  group_by_clause = "(t2.id)"
  @related_tags = ActsAsTaggableOn::Tagging.select(select_clause).joins(join_clause).where(where_clause).from(from_clause).group(group_by_clause).collect do |t|

ActsAsTaggableOn::Tag.find(t.tag_id) 结束

如何以更多的方式重写相同的内容。

【问题讨论】:

  • taggings t1taggings t2 是两个不同的表吗?如果是,它们是否在 Rails 模型中关联?
  • @ScottJShea 两者都不是来自 ActsAsTaggableOn 的相同表标记

标签: ruby ruby-on-rails-3.1 model acts-as-taggable-on


【解决方案1】:

我不确定我是否完全理解您的问题,但您可以使用 find_by_sql 或重组您的查询以通过方法/范围链接使用 Arel。例如:

Tag.select("count(...)").from("taggings").join("inner join taggings...")

【讨论】:

  • tag = ActsAsTaggableOn::Tag.find_by_name(params[:id]) join_clause = 'INNER JOIN 标记为 t2 ON(t1.taggable_id = t2.taggable_id 和 t1.taggable_type = t2.taggable_type)' select_clause = "DISTINCT t2.tag_id" from_clause = 'taggings as t1' where_clause = "t1.tag_id = #{tag.id} and t2.tag_id != #{tag.id}" group_by_clause = "(t2.id)" related_tags = ActsAsTaggableOn::Tagging.select(select_clause).joins(join_clause).where(where_clause).from(from_clause).group(group_by_clause).collect do |t|ActsAsTaggableOn::Tag.find(t.tag_id)end 如何以更多的方式重写相同的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多