我有这些方法的模型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
上传器的默认值,但它不适用于此查询,而avatar
为null
。
答案 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