使用before_create我创建一个标签系统目前位置后的has_many:标签:通过=>:tag_joins在Rails3中
现在当一个新的标签创建,一个连接会自动创建,连接标签并在后面创建标签。问题是我想使用before_create来检查是否已经创建了具有相同名称和用户标识的标签。如果它已经被创建,我想让连接使用原始标记ID,而不是让它创建一个新的标记ID。
有关如何完成此任务的任何提示?
使用before_create我创建一个标签系统目前位置后的has_many:标签:通过=>:tag_joins在Rails3中
现在当一个新的标签创建,一个连接会自动创建,连接标签并在后面创建标签。问题是我想使用before_create来检查是否已经创建了具有相同名称和用户标识的标签。如果它已经被创建,我想让连接使用原始标记ID,而不是让它创建一个新的标记ID。
有关如何完成此任务的任何提示?
您不能在您的模型中使用:before_save
运行私有方法吗?
如果你把这样的代码:
:before_save :method_to_check_something
...你将能够运行在模型验证的任何方式没有得到所涉及的控制器(从而秉承瘦控制器,脂肪模型方法)。
我不明白before_save会如何工作?如果重复项已存在,我不希望创建标签。事后关于连接表不保存种类? – Elliot 2011-02-12 15:17:29
为什么不使用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
这应该照顾之间的重复记录邮政和标签,但不知道如何与用户建立关联。
class Post < ActiveRecord::Base
has_many :tags, :through => :tag_joins, :uniq => true
end
我只是好奇,标准的Rails约定将命名连接表'posts_tags'。你只是不喜欢这个名字?除了post_id和tag_id之外,表中还有其他字段吗?我无法想象会发生什么。 – 2011-02-12 15:47:19
请参阅我的更新。 – dombesz 2011-02-13 00:03:30