我有 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
表将数据插入到 User
和 Client
表中。
最佳答案
我知道我已经在评论中说明了这一点,但它应该绝对有效:
由于 Admin
模型对 username
进行了验证,因此无法简单地将 client
添加到 user.clients
集合,因为它会导致 ActiveRecord::Validation 错误。
相反,您应该单独执行这些步骤,或者创建一个可以同时执行所有步骤的方法:
- 创建一个用户对象:
user = User.create(name: "name", email: "email@email.com")
- 创建一个客户端对象
client = Client.create(name: "name")
- 创建一个管理对象
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/