你如何组织一个在Rails 3中有很多关系?

时间:2011-02-15 01:32:00

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我有3个模型:帐户,讨论和标记(由is_taggable提供)

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

注意:标记源是针对is_taggable用于将标记连接到可标记模型的连接表(讨论,在本例中为......)

离开这个HM的问题:通过这种方式,在不同的讨论中多次出现相同的标签将迫使它们在这种关联中出现相同的次数。所以,我认为“没问题,我会将这个关联分组到taggings表的tag_id上,所以每个标签只显示一次。

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

这不起作用,进一步检查这个生成的SQL显示GROUP BY没有出现在SQL中。我的问题是,如何让它发挥作用?

我尝试过的其他一些事情:

  • 制作实例方法,“标签”。虽然这正确地返回了我的结果集,但它不是AR集合,所以我无法像这样操纵它。 (也许有人知道如何正确地做到这一点?)
  • 使用:unique =>真正的选择。听起来它很有用,但是因为我们正在寻找:taggings表,所以它试图使其独一无二,并且该表中的所有条目都是 unique(tag_id + taggable_id [我们的讨论]),没有任何变化。

提前感谢您的任何帮助,并为任何与iPad相关的拼写错误道歉。

1 个答案:

答案 0 :(得分: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系列。您还可以向您的帐户模型添加一个方法,该方法仅使用self标记该范围,例如:

def tags.
  Tags.account(self)
end