Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 通过第三个表插入数据_Ruby_Ruby On Rails 4_Activerecord_Has Many Through - Fatal编程技术网

Ruby 通过第三个表插入数据

Ruby 通过第三个表插入数据,ruby,ruby-on-rails-4,activerecord,has-many-through,Ruby,Ruby On Rails 4,Activerecord,Has Many Through,我有3个模型客户端,用户和管理员没有控制器 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 :ad

我有3个模型客户端,用户和管理员没有控制器

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
然后一切正常

(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也有它的强制列用户名。
另外,如何通过此管理表将数据插入用户和客户端表。

当您创建这样的客户端时,u=User.first.clients.newname:“first Client” 它只插入行和列的名称,创建时为,更新时为

当你像这样呼叫User.first.clients时, 它将查找User.first拥有的管理员。然后通过管理员查找客户端

所以,不存在与您首先创建的客户端有关系的管理员

您应该设置admin_ID在创建客户机时,此列可能存在于客户机表中,如下所示

user = User.first
client = user.clients.create(name: 'xxx')
user.clients << client

让我逐一回答你的问题

1:那么如何将数据插入第三个表中呢

如报告中所述

4.3.1 has\u增加的方法很多

当您声明一个有多个关联时,声明类 自动获取与关联相关的16种方法:

应该是

clients = User.first.clients
client = Client.new(name: 'First Client')
clients << client
collection方法返回所有关联的 物体。如果没有关联的对象,则返回空值 数组


希望这有助于你正确的理解

我知道我已经在评论中提到了这一点,但它肯定会起作用:

由于管理模型对用户名进行了验证,因此无法简单地将客户端添加到user.clients集合,因为这将导致ActiveRecord::validation错误

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

创建用户对象:user=user.createname:名称,电子邮件:email@email.com 创建客户端对象client=client.createname:name 创建一个admin对象admin=admin.createusername:username,user:user,client:client 这将创建必要的表条目,因此当您检查user.clients时,它将在user_id=user.id的admins表中查找所有条目,然后检索所有相应的客户端

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

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

对于用户类


如果您检查日志,您可以看到,当您保存一个新客户机时,它只会创建客户机记录,而不会创建管理员记录。然而,搜索查询正在查看Admin表,无法找到任何记录。尝试类似的方法:c=Client.createname:name,然后是User.first.clients是的,谢谢你的回复@Kkulikovskis我已经尝试了你说的,但在这个问题上,当我这样做的时候,它给我的用户名错误不能为空,这是在管理模型中,当我尝试提供用户名时,它会说未知属性“用户名”哦,对不起。没有注意到用户名字段。在这种情况下,除了分别创建它们之外,我看不到任何其他方法。e、 g.c=客户。新名称:名称;u=用户优先;Admin.createusername:username,client:c,user:unups不起作用,它只是说开始事务回滚事务和client.first.users仍然是我的错。客户端对象未持久化到数据库。检查我的答案,看它是否有效这不完全是真的,因为has_many到应该在不显式说明管理员id的情况下处理这个问题…clients.new…,在ActiveRecord::Associations::CollectionProxy关系数组中没有新方法,只生成。@Kkulikovski没有,activerecord如何确定在创建新客户端时选择哪个管理员id?用户有许多管理员,代码没有指定管理员id,您在控制台中尝试过吗?@新的和构建两个可能的名称哦,我的错,它是别名。据我所知,问题在于您需要为管理员关联声明用户名。这就是回滚事务ActiveRecord::RecordInvalid:验证失败的原因:用户名不能为空,它给我管理员的验证错误,因为这个答案已经在注释中给出了。@MalwareSkiddie:应该是因为它显然抛出了验证失败:用户名不能为空,只要删除验证就行了@Vinay这不是一个answer@MalwareSkiddie好的,你还面临什么问题?谢谢,这是可行的,但是你能不能用一种简单的方法来创建它,而不是单独创建,因为当我为它制作控制器时,这对我来说是很容易的。@MalwareSkiddie很乐意帮你:请很好地标记答案。我不能像我一样没有足够的声誉做这件事。谢谢你的反馈!一旦您赢得了总共15个声誉,您的投票将更改公开显示的帖子分数抱歉:/
collection<<(object, ...)
u = User.first.clients.new(name: 'First Client')
clients = User.first.clients
client = Client.new(name: 'First Client')
clients << client
collection(force_reload = false)
def add_client(client_name, admin_username)
  client = Client.create(name: client_name)
  admin = Admin.create(username: admin_username, client: client, user: self)
end