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

模型
tech.rb
class Tech < ActiveRecord::Base
has_many :services
endservice_menu
class ServiceMenu < ActiveRecord::Base
has_many :services
endservice.rb
class Service < ActiveRecord::Base
belongs_to :tech
belongs_to :service_menu
end控制器
services_controller.rb
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视图
<%= 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数据库之前:
| 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数据库现在:
| 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中,因为不再需要它。
感谢所有回应的人。
发布于 2015-07-03 03:08:30
我没有测试代码,但这可能有效。
首先,将视图更改为设置service_menu_id
<%= collection_select(:service, :service_menu_id, ServiceMenu.all, :id, :name, {:prompt => true }) %>其次,在控制器中,允许service_menu_id传递:
def service_params
params.require(:service).permit(:service_menu_id)
end然后,当您构建服务时,service_menu_id将被成功地传递。
发布于 2015-07-03 03:03:27
您需要将has_many :through关系添加到模型中:
tech.rb
class Tech < ActiveRecord::Base
has_many :services
has_many :service_menus, through: :services
endservice_menu.rb
class ServiceMenu < ActiveRecord::Base
has_many :services
has_many :techs, through: :services
endservice.rb
class Service < ActiveRecord::Base
belongs_to :tech
belongs_to :service_menu
end一旦您这样做,Active Record将为您处理连接模型(服务)事务。您可以在Rails控制台中演示这一点:
>> 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">`发布于 2015-07-03 04:24:15
您需要执行以下更改。
在您的service_menu_id中添加servuce_params。
def service_params
params.require(:service).permit(:name, :service_menu_id)
end并像这样修改视图代码
<%= 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 %>https://stackoverflow.com/questions/31197573
复制相似问题