我对rails编程还很陌生,这是我在stackoverflow上的第一个问题。
我有模型组和产品如下:
class Group < ActiveRecord::Base
has_many :products
end
class Products < ActiveRecord::Base
belongs_to :Group
end
现在,我有一些数据在多个组中填充了多个产品。当我想将其中一个产品从一个组移到另一个组时,我该怎么办?
- 我应该使用has_many:通过关系(这是唯一建议的方式)? (因为我认为处理3个表比2个表更复杂,计算密集。)
- 这是否有一种首选方式?
以下是我尝试过的事情: - 在产品中设置nil到group_id并更新它以删除有效的关联。我只是不确定这是否是解除对象关联的正确方法。
- 我尝试在groups_controller.rb中创建自定义函数,如下所示。 (我知道这可能不是正确的做法,但我有点绝望)
在/view/groups/show.html.erb中我有 <% form_tag group_add_reference_path(@group.id), :method => 'put' do %>
<%= hidden_field_tag 'params[group_id]', "#{@group.id}" %>
<div class="field">
<%= collection_select('params', 'product_id', Product.where(:group_id => nil), :id, :name) %>
</div>
<div class="actions">
<%= submit_tag "assign", :name => nil %>
</div>
<% end %>
在groups_controller.rb中我有
def add_reference
@group = Group.find(params[:group_id])
@product = Product.find(params["product_id"])
@group.products << @product
end
- 我已经在railsguides中阅读了association_basics的详细关联参考章节,并且因为它添加了集合&lt;&lt;(对象)函数,所以我应该能够做到接近上面的事情。 (由于@product由于某种原因似乎是零,因此无法正常工作,即使我将其设置为有效ID并对其进行硬编码,也会在此之后失败)
答案 0 :(得分:1)
我想你可能已经自己回答了这个问题:
如果他们一次只能与一个组关联,请执行以下操作:
def add_reference
@product = Product.find(params[:product_id])
@product.update_attribute("group_id", params[:group_id])
end
答案 1 :(得分:0)
将产品从一个组移动到另一个组只需要一件简单的事情:将产品的group_id
更改为“指向”新组,即group_id
列应包含新组的ID改变之后。 Trip先生的答案向您展示了实际的代码。
答案 2 :(得分:0)
我发现了它无法正常工作的原因。
在我编写的上述代码中,collection_select返回一个哈希本身。 因此:
@product = Product.find(params[:product_id])
不起作用(因为所有请求参数也都是哈希值)。
我必须做的是访问递归哈希(不确定这个词是否正确),如:
@product = Product.find(params[:params][:product_id])
或者,使用where而不是find:
@product = Product.where(params[:params]).limit(1)
它有效!!
感谢您的所有评论。这让我继续努力。