2011-08-29 45 views
2

包装ActiveRecord访问器的推荐方式是什么?继承ActiveRecord访问器

鉴于类似

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

我希望能够使它的是,例如,@post.comments回报随机排序的意见。

当然,我可以创建另一种方法,如random_comments,但我想知道是否有一个较少的错误倾向方式(我不想记得调用random_comments方法)。

调用super不起作用,因为comments方法是在Post类中反射性地创建的,而不是继承的。

那么你会怎么做呢?

+1

要小心,因为你不是在谈论simpy重写属性,这很容易通过'read_attribute',而是关联。这可能是一个坏主意,因为你会扔掉所有的关联代理方法('comment#create','comments#clear'等等)。你可能会考虑使用范围或关联扩展来实现这个,导致'comments.randomized'或类似的东西。 – numbers1311407

回答

0

希望这有助于..

class Post < ActiveRecord::Base 
    has_many :comments 

    def comments_with_randomness 
    comments_without_randomness.shuffle 
    end 

    alias_method_chain :comments, :randomness 
end 

现在,致电@post.comments应按随机顺序返回评论。但是,请记住,这将是一个数组而不是一个积极的关系。

1

可以定义默认顺序一样

has_many :comments, :order => "RAND()" 

RAND()将只能如果数据库引擎支持的话,(MySQL支持)

+0

谢谢,但虽然有用,但您的答案仅解决特定情况,这只是一个示例。无论如何,尽管 – asymmetric

+0

和真正隐藏的目标是什么? ;) – sarvavijJana