我有一个Post
模型belongs_to :author
。如果在创建期间将作者设置在帖子上,post.author
将返回作者。但是,如果作者没有设置在帖子上,我希望在调用post.author
时仍然返回默认作者。我有以下内容:
class Post
belongs_to :author
def author
begin
Author.find(read_attribute("author_id"))
rescue
Author.default_author
end
end
end
我的问题是是否可以覆盖关联方法author
。这是否会导致关联等内部处理被绕过?有一个更好的方法吗?例如,我应该使用类似method_missing
的内容吗?
答案 0 :(得分:1)
我将before_validation
设置为空白
class Post < ActiveRecord::Base
belongs_to :author
before_validation :set_author
validates :author, :presence => true
def set_author
self.author = Author.default if author.blank?
end
end
答案 1 :(得分:1)
#app/models/post.rb
class Post < ActiveRecord::Base
before_create :set_author, unless: Proc.new {|post| post.author.present? }
private
def set_author
self.author_id = "2"
end
end
答案 2 :(得分:0)
在您的特定情况下,我不会推荐
覆盖关联方法作者
与数据库中的列具有相同的名称,因为如果您认为另一位开发人员落后于您,那么在post上调用author属性并不仅仅返回author列的数据就不明显了,但实际上它会返回默认作者,如果它不存在。
因此,我会说你需要创建一个名为author_or_default_author
之类的新方法,因此希望该方法返回的内容很明显
此外,当您只是尝试创建作者记录时,覆盖模型中的列名实际上将运行该代码。无论这是否可取,对于另一位开发者来说,这绝对不是显而易见的
你可能会考虑做这样的事情
class Post
belongs_to :author
def author_or_default_author
Author.where(id: author_id).present? || Author.default_author
end
end
并用
调用它post.author_or_default_author
在上面的示例中使用.where的一个好处是,如果在1234无效时尝试了Author.find(1234),则不必处理activerecord not found
类型的错误。作者身份。所以你可以摆脱你正在使用的begin and rescue