2011-10-10 67 views
0

假设我有帖子,通过分类有许多类别。假设我添加了一个布尔列primarycategorizations以确定帖子的主要类别。但现在我被困对付加入模型中,当我真正想要做的是这样的:有没有办法将方法委托给“主动”连接模型?

post = Post.first 
primary_cat = post.categories.where(:primary => true) 

post.categories.first.primary = true 
post.save # would actually update the categorization, setting primary = true 

还有的例子种种,我可以给你展示为什么这将是有益的,但基本上我希望能够与模型进行交互,就好像它以某种方式与其连接模型合并。能够说“什么是主要类别?”或者“确定这个类别将成为主要类别”,而不需要触及连接模型,这对我来说是直观的。

这甚至可能与Rails?有没有人看过以前做过这样的事情?

回答

1

我喜欢任务的解决方案,除了设置它应该只是post.primary_category=,并应采取类别对象。只需在帖子上设置一个has_one :primary_category,你就是金。

+0

尽管我同意setter应该在那里,但它不会在联接模型和帖子上保存活动状态,这可能是有用的后来。 – quest

-1

这个问题可能是Ruby on Rails: attr_accessor for submodels的一个副本,但基本上delegate应该是你要找的东西,还有一个额外的保存回调。

+0

我对代表非常熟悉,我不明白它是如何完成我期待的。给定的类别有很多分类。我如何知道要分配哪个分类? – steve

+0

哦,对不起,我错误地解释了你的问题 – riffraff

1

简短的答案是在类别上创建一个set_primary(post)方法,该方法以参数post和boolean为参数。

def set_primary(post) 
    categorization = post.categorization.where('your opts hash here') 
    categorization.primary = true 
    categorization.save! 
end 


post.categories.first.set_primary(post) 
+0

是的,这有点解决了这个问题,但只有一方面。我试图看看是否存在更全面/整体的解决方案。 – steve

1

查理鲍曼不具有对分类模型set_primary逻辑第一块拼图,但是他的二传手不取消之前的活动范畴。另外,史蒂夫的问题昂贵的部分,实际上只是获取每个请求的主要类别。为了解决这个问题,我还会在邮件本身上保存主类别ID。这样你就不需要访问连接模型来找出主要的类别。

def set_primary_category(post) 
    post.categorizations.each do |cat| 
    if cat.post == post 
     cat.primary = true 
     cat.save! 
     post.update_attribute(:primary_category_id, cat.category_id) 
    else 
     cat.update_attribute(:primary, false) if cat.primary 
    end 
    end 
end 

要设置:

post.categories.first.set_primary(post) 

来访问:

post.primary_category 

不幸的是,我不认为任何人作出了宝石,使这个您更轻松地完成,但逻辑非常简单。它还具有在分类和帖子中访问主要状态的好处,因此您始终可以快速访问数据。

另外,我认为它很好记。您对帖子/类别拥有多对多的关系。但是对于post/primary_category只有一个关系。只要你有这样的访问模式,我喜欢尝试并远离has_one的连接模型,因为它不是必需的。

+0

你可能也想看看关联方法,他们可能会完成你所需要的。旧学校,但仍然有用。 HTTP:// ryandaigle。com/articles/2006/12/3/extend-your-activerecord-association-methods – quest

相关问题