【问题标题】:Add attribute to Rails 5 model, which not exists in the database向 Rails 5 模型添加属性,该属性在数据库中不存在
【发布时间】:2017-11-30 17:21:29
【问题描述】:

我有桌子 - usersarticles。它是一对多的关系,或者用户可以有很多文章。我想要的是从users 表中选择所有用户LIMIT 40,但包括计算每个用户的所有文章-为每个用户添加属性count_articles。我正在尝试这种方式:

def self.get_users(limit, offset)
  users = []
  order('created_at').limit(limit).offset(offset).each do |user|
    user.attributes[:count_articles] = user.articles.count
    users << user
    byebug
  end
  users
end

,但我得到的用户没有这个属性。如果我使用 byebug 并输入 控制台 - user.count_articles,我可以看到当前用户的count_articles 的结果,但是如果我只输入user,我会看到没有count_articles 的所有属性。

【问题讨论】:

  • Rails 5.0 中的ActiveRecord::Base#inspect 方法只包含列名。 Rails 5.1 包含虚拟属性名称。
  • 你解决了吗?

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

你可以试试:

User.joins(:articles)
    .select('users.id, users.name, COUNT(articles.id) AS count_articles')
    .group('users.id')
    .limit(40)

【讨论】:

  • 嗨,谢谢你的回答。如果没有适合他的文章,这不会返回给我任何用户。我修复了这样的左连接joins("LEFT JOIN articles ON users.id = articles.user_id").select()。我知道可行的方式是最好的方式:),但我认为有更好的 Rails 方式。
  • left_joins 也许? User.left_joins(:articles).select('users.id, users.name, COUNT(articles.id) AS count_articles').group('users.id')
【解决方案2】:

我在做某事。与子选择类似。所以不需要加入。

尝试将其放入您的用户模型中:

def self.get_users(limit=40, offset=0)
  order(:created_at)
  .limit(limit)
  .offset(offset)
  .select('users.*, (SELECT COUNT(id) FROM articles WHERE articles.id = users.id) articles_count')
end

返回的数组中生成的用户实例将具有属性“articles_count”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多