首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails -如何同时记录两个引用ID

Rails -如何同时记录两个引用ID
EN

Stack Overflow用户
提问于 2015-07-03 02:35:17
回答 4查看 84关注 0票数 0

两个引用ID中只有一个是在我的一个表中设置的。

模式

模型

tech.rb

代码语言:javascript
复制
class Tech < ActiveRecord::Base
    has_many :services
end

service_menu

代码语言:javascript
复制
class ServiceMenu < ActiveRecord::Base
  has_many :services
end

service.rb

代码语言:javascript
复制
class Service < ActiveRecord::Base
  belongs_to :tech
  belongs_to :service_menu
end

控制器

services_controller.rb

代码语言:javascript
复制
def new
    @service = current_tech.services.build
end

def create
    @service = current_tech.services.build(service_params)

    respond_to do |format|
      if @service.save
        format.html { redirect_to @service, notice: 'Service was successfully created.' }
        format.json { render :show, status: :created, location: @service }
      else
        format.html { render :new }
        format.json { render json: @service.errors, status: :unprocessable_entity }
      end
    end
end

private

def service_params
  params.require(:service).permit(:name)
end

视图

代码语言:javascript
复制
<%= simple_form_for @service do |f| %>
  <div class="field">
    <%= f.label "Select service category" %>
    <br>

    <%= collection_select(:service, :name, ServiceMenu.all, :name, :name, {:prompt => true }) %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

每当我创建新服务时,只记录tech_id,而不记录service_menu_id。如何创建一个新服务,将技术ids和service_menu ids同时记录到服务表中?

任何帮助都是非常感谢的。

编辑7/3 2:55 PM EST

@Yen方法一开始对我不起作用,但现在起作用了。首先,我未能正确地引用service_menu_id中的services table

我的services数据库之前:

代码语言:javascript
复制
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| name            | varchar(255) | YES  |     | NULL    |                |
| tech_id         | int(11)      | YES  | MUL | NULL    |                |
| service_menu_id | int(11)      | YES  |     | NULL    |                |
| created_at      | datetime     | NO   |     | NULL    |                |
| updated_at      | datetime     | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

以前不工作的原因是KEY列下没有KEY值。

我的services数据库现在:

代码语言:javascript
复制
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| name            | varchar(255) | YES  |     | NULL    |                |
| tech_id         | int(11)      | YES  | MUL | NULL    |                |
| service_menu_id | int(11)      | YES  | MUL | NULL    |                |
| created_at      | datetime     | NO   |     | NULL    |                |
| updated_at      | datetime     | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

这还允许我将name列删除到services db中,因为不再需要它。

感谢所有回应的人。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-03 03:08:30

我没有测试代码,但这可能有效。

首先,将视图更改为设置service_menu_id

代码语言:javascript
复制
    <%= collection_select(:service, :service_menu_id, ServiceMenu.all, :id, :name, {:prompt => true }) %>

其次,在控制器中,允许service_menu_id传递:

代码语言:javascript
复制
def service_params
  params.require(:service).permit(:service_menu_id)
end

然后,当您构建服务时,service_menu_id将被成功地传递。

票数 1
EN

Stack Overflow用户

发布于 2015-07-03 03:03:27

您需要将has_many :through关系添加到模型中:

tech.rb

代码语言:javascript
复制
class Tech < ActiveRecord::Base
  has_many :services
  has_many :service_menus, through: :services
end

service_menu.rb

代码语言:javascript
复制
class ServiceMenu < ActiveRecord::Base
  has_many :services
  has_many :techs, through: :services
end

service.rb

代码语言:javascript
复制
class Service < ActiveRecord::Base
  belongs_to :tech
  belongs_to :service_menu
end

一旦您这样做,Active Record将为您处理连接模型(服务)事务。您可以在Rails控制台中演示这一点:

代码语言:javascript
复制
>> tech = Tech.create(name: "bar")
   (0.2ms)  begin transaction
  SQL (0.4ms)  INSERT INTO "techs" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "bar"], ["created_at", "2015-07-03 23:30:26.893615"], ["updated_at", "2015-07-03 23:30:26.893615"]]
   (10.7ms)  commit transaction
=> #<Tech id: 4, name: "bar", created_at: "2015-07-03 23:30:26", updated_at: "2015-07-03 23:30:26">
>> tech.service_menus << ServiceMenu.create(name: "baz")
   (0.1ms)  begin transaction
  SQL (0.4ms)  INSERT INTO "service_menus" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "baz"], ["created_at", "2015-07-03 23:31:21.045841"], ["updated_at", "2015-07-03 23:31:21.045841"]]
   (18.9ms)  commit transaction
   (0.1ms)  begin transaction
  SQL (0.5ms)  INSERT INTO "services" ("tech_id", "service_menu_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["tech_id", 4], ["service_menu_id", 4], ["created_at", "2015-07-03 23:31:21.072932"], ["updated_at", "2015-07-03 23:31:21.072932"]]
   (33.1ms)  commit transaction
  ServiceMenu Load (0.3ms)  SELECT "service_menus".* FROM "service_menus" INNER JOIN "services" ON "service_menus"."id" = "services"."service_menu_id" WHERE "services"."tech_id" = ?  [["tech_id", 4]]
=> #<ActiveRecord::Associations::CollectionProxy [#<ServiceMenu id: 4, name: "baz", created_at: "2015-07-03 23:31:21", updated_at: "2015-07-03 23:31:21">]>
>> Service.first
  Service Load (0.4ms)  SELECT  "services".* FROM "services"  ORDER BY "services"."id" ASC LIMIT 1
=> #<Service id: 2, tech_id: 4, service_menu_id: 4, created_at: "2015-07-03 23:31:21", updated_at: "2015-07-03 23:31:21">`
票数 1
EN

Stack Overflow用户

发布于 2015-07-03 04:24:15

您需要执行以下更改。

在您的service_menu_id中添加servuce_params

代码语言:javascript
复制
def service_params
  params.require(:service).permit(:name, :service_menu_id)
end

并像这样修改视图代码

代码语言:javascript
复制
<%= simple_form_for @service do |f| %>
  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label "Select service category" %>
    <br>

    <%= collection_select(:service, :service_menu_id, ServiceMenu.all, :name, :name, {:prompt => true }) %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31197573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档