如何使用has_many关联,解除对象的关联

时间:2011-12-14 20:51:08

标签: ruby-on-rails

我对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并对其进行硬编码,也会在此之后失败)

3 个答案:

答案 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)

它有效!!

感谢您的所有评论。这让我继续努力。