Rails:拥有并属于许多人(HABTM) - 创建关联而不创建其他记录

jmc*_*tie 15 activerecord ruby-on-rails has-and-belongs-to-many

在Google上花了一整天,但找不到答案.:\

我在用户和Core_Values之间有HABTM关系.

class CoreValue < ActiveRecord::Base
  has_and_belongs_to_many :users

class User < ActiveRecord::Base
  has_and_belongs_to_many :core_values
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我需要做两件事:

  1. 如果CoreValue不存在,请创建一个新的并将其与给定的用户ID相关联,并且
  2. 假设我知道特定的CoreValue确实存在,请创建关联而不创建任何新的CoreValues或Users

对于#1,我有这个工作:

User.find(current_user.id).core_values.create({:value => v, :created_by => current_user.id})
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的CoreValue:value和:created_by并创建关联.

对于#2,我尝试过一些东西,但似乎无法创建关联.

谢谢你的帮助!

von*_*rad 21

您可以使用非常有用的find_or_create方法分两步执行此操作.find_or_create将首先尝试查找记录,如果它不存在,则创建它.像这样的东西应该做的伎俩:

core_value = CoreValue.find_or_create_by_value(v, :created_by => current_user.id)
current_user.core_values << core_value
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 第一行将查找或创建值v.如果它不存在并且已创建,则将其设置created_bycurrent_user.id.
  • 没有必要这样做User.find(current_user.id),因为它将返回相同的对象current_user.
  • current_user.core_values是一个数组,您可以使用它轻松地添加另一个值<<.

为简洁起见,以下内容与上面的代码示例相同:

current_user.core_values << CoreValue.find_or_create_by_value(v, :created_by => current_user.id)
Run Code Online (Sandbox Code Playgroud)