ruby-on-rails - 使用 has_many :through and build

标签 ruby-on-rails ruby has-many-through

我有三个模型,都用于 has_many :through 关系。它们看起来像这样:

class Company < ActiveRecord::Base

  has_many :company_users, dependent: :destroy
  has_many :users, through: :company_users

  accepts_nested_attributes_for :company_users, :users

end

class CompanyUser < ActiveRecord::Base
  self.table_name = :companies_users #this is because this was originally a habtm relationship
  belongs_to :company
  belongs_to :user
end

class User < ActiveRecord::Base
  # this is a devise model, if that matters

  has_many :company_users, dependent: :destroy
  has_many :companies, through: :company_users

  accepts_nested_attributes_for :company_users, :companies

end

这加载很好,并且连接是为查询而构建的。但是,每当我做类似的事情时

@company = Company.last
@user = @company.users.build(params[:user])

@user.save    #=> true
@company.save #=> true

User记录和 CompanyUser记录被创建,但是 company_id CompanyUser 中的字段记录设置为 NULL

INSERT INTO `companies_users` (`company_id`, `created_at`,`updated_at`, `user_id`) 
VALUES (NULL, '2012-02-19 02:09:04', '2012-02-19 02:09:04', 18)

当你 @company.users << @user 时它做同样的事情

我确定我在这里做了一些愚蠢的事情,我只是不知道是什么。

最佳答案

你不能像那样使用has_many :through,你必须这样做:

@company = Company.last
@user    = User.create( params[:user] ) 
@company.company_users.create( :user_id => @user.id )

然后您将正确定义关联。

更新

在下面的评论中,因为您已经有了 accepts_nested_attributes_for,所以您的参数必须像这样:

{ :company => 
    { :company_users_attributes => 
        [ 
          { :company_id => 1, :user_id => 1 } ,
          { :company_id => 1, :user_id => 2 },
          { :company_id => 1, :user_id => 3 } 
        ]
    } 
}

并且您会自动为您将用户添加到公司。

关于ruby-on-rails - 使用 has_many :through and build,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9346261/

相关文章:

ruby-on-rails - Ruby on Rails 3 - 公共(public)实时聊天

ruby - 退出注册机的正确方式是什么?

javascript - 使用 Rails 时如何在 list 文件中读取 Sprockets 指令?

ruby-on-rails - Rails 防止多态 has_many 中的重复项 :through associations

ruby-on-rails - 设计 - 它如何设置 session cookie?

ruby-on-rails - Rails 中的可选位置

mysql - 使用通用 where 过滤器参数从 mysql 数据库表中删除记录的工具

ruby-on-rails - 从rails方法获取json数据

ruby-on-rails - 如何通过关系强制 rails 不使用 has_many 的缓存结果?

ruby-on-rails - Rails 自定义 ActiveRecord::Type 在 has_many 中使用 `class_name` 时失败:通过关联