2011-02-15 22 views
2

我有3种型号:帐户,讨论和标签(由is_taggable提供)你如何在Rails 3中组织一个有很多贯穿的关系?

class Account 
    has_many :discussions 
end 

class Discussion 
    belongs_to :account 
    has_many :tags 

    is_taggable 
end 

我希望能够做current_account.tags,列出所有当前正在使用的帐户的讨论的标签。所以......

class Account 
    has_many :discussions 
    has_many :tags, :through => :discussions, :source => :taggings 
end 

注:源的Tagging是联接表is_taggable用途加入标签,您可加标签模型(讨论,在这种情况下...)

与离开这个问题HM:通过这种方式,在不同的讨论中多次出现相同的标签会强制它们在这个关联中出现相同的次数。所以,我想:“没问题,我会组此关联的引用的Tagging表的TAG_ID,所以每个标签只有一次出现了。

class Account 
    has_many :discussions 
    has_many :tags, :through => :discussions, :source => :taggings, :group => "taggings.tag_id" 
end 

这是不行的,这产生了SQL的进一步检查显示群组BY没有出现在SQL我的问题,我怎么得到这个工作

其他有些事情我想:?

  • 制作实例方法,“标签”。虽然这回我结果设置正确,它不是一个AR收藏,所以我无法如此操作它(也许有人知道如何正确地做到这一点?)
  • 使用:unique => true选项。听起来像是会起作用,但由于我们正在采购:标签表,这就是它试图使其唯一,并且该表中的所有条目都是唯一的(tag_id + taggable_id [我们的讨论]),所以没有任何变化。

在此先感谢您提供任何帮助,并对任何与iPad相关的错别字致歉。

+0

这对您有帮助吗? http://stackoverflow.com/questions/2061389/named-scope-in​​-rails-unique-records - 我还没有遇到像你一样的需求,所以只是帮助研究。 – Steve 2011-02-15 01:45:06

回答

1

使用的标签,比如这个名为范围:

scope :account, lambda { |account| 
    select('DISTINCT taggings.*'). 
    join('discussions on discussions.id = taggings.discussion_id'). 
    where("discussions.account_id = ?", account.id) 
} 

然后,只是把它作为:

Tags.account(current_account) 

而且你会回来的AR集合。您也可以在您的帐户模型中添加一个方法,在自己的标签中将其称为该范围,如:

def tags. 
    Tags.account(self) 
end