在rails3中使用before_create

时间:2011-02-12 07:08:55

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

我正在创建一个标记系统,其中Post has_many:tags,:through => :tag_joins

现在,当创建新标记时,会自动创建一个连接,连接标记并创建标记的帖子。问题是我正在尝试使用before_create来检查是否已经创建了具有相同名称和用户ID的标记。如果它已经创建,我希望联接使用原始标记ID,而不是让它创建新的标记ID。

关于如何实现这一目标的任何提示?

3 个答案:

答案 0 :(得分:2)

为什么不使用find_or_create_by_user_id_and_tag_id()find_or_initialize_by_

<强>更新

<击> 因此,如果您想避免创建重复的标签,可以使用:

@post.tags.find_or_create_by_name('tag_name')

或者如果要在保存新对象之前应用某些更改,请使用

@post.tags.find_or_initialize_by_name('tag_name')

在这两种情况下,默认情况下name属性将设置为“tag_name”。

因此,如果存在,此方法将返回标记,否则创建它,因此您可以在设置连接模型时使用此标记。

更新2

这实际上不适用于has_many:通过,您可以在此处看到类似的问题和解决方法: Error while using `find_or_create_by` on a `has_many` `through` association

答案 1 :(得分:1)

您无法使用:before_save在模型中运行私有方法吗?

如果您输入如下代码:

:before_save :method_to_check_something

...您将能够在模型中运行任何方式的验证,而无需涉及控制器(从而坚持瘦的控制器,脂肪模型方法)。

答案 2 :(得分:0)

这应该处理帖子和标签之间的重复记录,但不确定如何与用户建立关联。

class Post < ActiveRecord::Base
  has_many :tags, :through => :tag_joins, :uniq => true
end