在模型Ruby on Rails 5

时间:2018-03-19 14:11:42

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

我有这些方法的模型Comment

def self.get_article_comments(id, limit, offset)
 joins("LEFT JOIN articles ON comments.commentable_type = 'Article' AND comments.commentable_id = articles.id")
.joins("LEFT JOIN users ON comments.user_id = users.id")
    .select('comments.user_id, users.avatar, comments.comment, users.name')
    .where(["articles.id= ?", id])
    .order('comments.id DESC').limit(limit).offset(offset)
end

def set_avatar
  self.avatar ||= self.user.avatar_url
end

我想为每个用户设置头像(set_avatar方法),但仅限于用户表中的null。 我尝试的是这个:

  after_initialize :set_avatar, unless: :persisted?

,但由于avatar列不是评论表的一部分,我收到此错误:

  

undefined method`avatar'for Comment:0x00007ff37eb87198>

,在某些我没有使用get_article_comments的控制器方法中。

self.user.avatar_url - avatar_url来自Carrierwave gem,我将获得用户头像。

是的,有一种方法可以在控制器方法或get_article_comments方法中执行此操作,我可以循环结果,检查并设置avatar,但有更明确的方法吗?

例如,在为特定方法选择数据后,是否可以执行set_avatar

修改

我使用Carrierwave上传器的默认值,但它不适用于此查询,而avatarnull

1 个答案:

答案 0 :(得分:0)

  

一个类使用另一个类的内部字段和方法。

以上是代号气味的定义,称为“不恰当的亲密关系”。

您可以在User类中使用一个方法来强制化身字段的默认值或数据库模式的默认值。

为什么没有Carrierwave建议的默认值?

class MyUploader < CarrierWave::Uploader::Base
  def default_url(*args)
    ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  end
end