ruby - 通过第三张表插入数据

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

我有 3 个没有 Controller 的模型(客户端、用户和管理员)

class Admin < ActiveRecord::Base
    validates_presence_of :username, :user_id, :client_id
    belongs_to :client
    belongs_to :user
end

class Client < ActiveRecord::Base
    validates_presence_of :name
    has_many :admins
    has_many :users, :through => :admins
end

class User < ActiveRecord::Base
    validates_presence_of :name, :email
    has_many :admins
    has_many :clients, :through => :admins
end

所以当我在做的时候

u = User.first.clients.new(name: 'First Client')
u.save

然后一切正常

(0.2ms)  begin transaction SQL (0.6ms)  INSERT INTO "clients" ("name",
"created_at", "updated_at") VALUES (?, ?, ?)  [["name", "First
Client"], ["created_at", "2015-12-27 10:38:47.790787"], ["updated_at",
"2015-12-27 10:38:47.790787"]]    (98.3ms)  commit transaction  =>
true

但当我试图看到

2.2.2 :130 >   User.first.clients
User Load (0.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1   Client Load (0.2ms)  SELECT "clients".* FROM "clients" INNER JOIN "admins" ON "clients"."id" = "admins"."client_id" WHERE "admins"."user_id" = ?  [["user_id", 1]] => #<ActiveRecord::Associations::CollectionProxy []>

那么如何向第三张表中插入数据呢? 我已经用谷歌搜索了很多关于这个但没有解决方案,因为这里的复杂性是第三个表 Admin 也有它的强制列 Username。 另外,如何通过此 Admin 表将数据插入到 UserClient 表中。

最佳答案

我知道我已经在评论中说明了这一点,但它应该绝对有效:

由于 Admin 模型对 username 进行了验证,因此无法简单地将 client 添加到 user.clients 集合,因为它会导致 ActiveRecord::Validation 错误。

相反,您应该单独执行这些步骤,或者创建一个可以同时执行所有步骤的方法:

  1. 创建一个用户对象:user = User.create(name: "name", email: "email@email.com")
  2. 创建一个客户端对象client = Client.create(name: "name")
  3. 创建一个管理对象admin = Admin.create(username: "username", user: user, client: client)

这将创建必要的表条目,因此当您检查 user.clients 时,它将查找 admins 表中的所有条目,其中 user_id = user.id 然后检索所有相应的客户端。

如果您在控制台中执行此操作,请在完成所有步骤后重新加载您的用户实例以查看客户端: user.reload.clients

为了使您的代码更有条理并同时执行所有这些步骤,您可以将其包装在用户实例方法中。例如:

针对用户类

def add_client(client_name, admin_username)
  client = Client.create(name: client_name)
  admin = Admin.create(username: admin_username, client: client, user: self)
end

关于ruby - 通过第三张表插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479677/

相关文章:

Ruby Gems 突然停止在 ubuntu 12.04 上工作

html - 将 CSS 和占位符文本应用于 Rails 登录表单

ruby 添加到具有数组值的散列

ruby-on-rails - rails 4 : Create new records through has_many association

ruby-on-rails - rails 截断错误数量的参数(3 为 2)

ruby-on-rails-4 - 耙子中止! JSON::GeneratorError:rake Assets 后源序列非法/格式错误的 utf-8:预编译

ruby-on-rails - Rails 4使用新参数重定向回

ruby-on-rails - 如何在 Ransack 中获得条件组?

ruby-on-rails - Ruby on Rails 的 varchar 迁移问题

ruby-on-rails - 重新分配 ActiveRecord 实例和相应的外键