【问题标题】:Active record association with named_scope repeat condition与 named_scope 重复条件的活动记录关联
【发布时间】:2012-07-04 07:34:11
【问题描述】:

我有关系,比如用户有很多文章,文章属于用户。
因此,为了查找用户的文章(处于活动状态),我在文章模型中添加了 named_scope

named_scope :active_articles, :conditions => "active = true"

什么时候做-

user.articles.active_articles

它按预期正确给出,但在控制台查询中有重复条件-

SELECT * FROM `articles` WHERE (`articles`.user_id = 52) AND ((active = true) AND (`articles`.user_id = 52))

如何限制条件的重复?

如何为关联添加条件?

我正在使用 rails 2.3.5。提前致谢。

【问题讨论】:

  • 我的 0.02 美元:相信查询优化器,不用担心。如果您使用的是 PostgreSQL 之类的数据库,您可以进行“分析”并查看这两个查询将完全相同(我预测)。

标签: ruby-on-rails activerecord named-scope


【解决方案1】:

我不确定,但我认为重复的原因是因为第一部分 “user.articles 将生成 WHERE (articles.user_id = 52)” 第二部分 "articles.active_articles 将生成 AND ((active = true) AND (articles.user_id = 52))"

所以当你同时调用两个部分 user.articles.active_articles 它将生成 (articles.user_id = 52) AND ((active = true) AND (articles.user_id = 52))

你可以调用 article.active_articles 吗?并发布结果?

【讨论】:

  • 它将如何工作?它总是给 undefind 方法 active_articles?
  • 是的,抱歉我没有写清楚,我的意思是你可能要找到具体的文章然后article.active_articles,所以不再重复了。
【解决方案2】:

您可以在您的用户模型中放置以下 has_many 关联:

has_many :active_articles, :conditions => {:active => true }, :class_name => "Article"

然后直接通过 user.active_articles 访问活跃文章。

我知道它不如 Article 模型上的 named_scope 好,但它确实消除了 ActiveRecord 生成的 SQL 查询中的条件重复

【讨论】:

  • 是的,这会起作用,但我正在寻找最好的方法以及为什么 Rails 添加额外的条件。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多