我正在创建一个标记系统,其中Post has_many:tags,:through => :tag_joins
现在,当创建新标记时,会自动创建一个连接,连接标记并创建标记的帖子。问题是我正在尝试使用before_create来检查是否已经创建了具有相同名称和用户ID的标记。如果它已经创建,我希望联接使用原始标记ID,而不是让它创建新的标记ID。
关于如何实现这一目标的任何提示?
答案 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