2011-02-12 54 views
0

使用before_create我创建一个标签系统目前位置后的has_many:标签:通过=>:tag_joins在Rails3中

现在当一个新的标签创建,一个连接会自动创建,连接标签并在后面创建标签。问题是我想使用before_create来检查是否已经创建了具有相同名称和用户标识的标签。如果它已经被创建,我想让连接使用原始标记ID,而不是让它创建一个新的标记ID。

有关如何完成此任务的任何提示?

+0

我只是好奇,标准的Rails约定将命名连接表'posts_tags'。你只是不喜欢这个名字?除了post_id和tag_id之外,表中还有其他字段吗?我无法想象会发生什么。 – 2011-02-12 15:47:19

+0

请参阅我的更新。 – dombesz 2011-02-13 00:03:30

回答

1

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

如果你把这样的代码:

:before_save :method_to_check_something 

...你将能够运行在模型验证的任何方式没有得到所涉及的控制器(从而秉承瘦控制器,脂肪模型方法)。

+0

我不明白before_save会如何工作?如果重复项已存在,我不希望创建标签。事后关于连接表不保存种类? – Elliot 2011-02-12 15:17:29

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

0

这应该照顾之间的重复记录邮政和标签,但不知道如何与用户建立关联。

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