2011-12-14 76 views
0

我對rails編程還是很新的,這是我在stackoverflow的第一個問題。如何使用has_many關聯,取消關聯對象

我有模型組和產品,像這樣:

class Group < ActiveRecord::Base 
    has_many :products 
end 

class Products < ActiveRecord::Base 
    belongs_to :Group 
end 

現在,我有一些數據充斥着多個產品在多個組。當我想將產品從一個組移到另一個時,我應該怎麼做?

- 我應該使用has_many:通過關係(這是唯一的建議方式)? (因爲我認爲處理3個表格比2個表格處理起來更復雜且計算密集)。

- 是否有這樣做的首選方法?

下面是我嘗試過的東西: - 在產品中設置nil to 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我在railsguides的association_basics

def add_reference 
    @group = Group.find(params[:group_id]) 
    @product = Product.find(params["product_id"]) 
    @group.products << @product 
    end 

-I've讀取詳細的協會參考篇章,因爲它集合< <(對象)的功能加入,不過,我覺得我應該可以做一些事情接近上面。 (這是行不通的,因爲@product由於某種原因似乎爲零,並且即使我將其設置爲有效的ID並對其進行硬編碼,之後它也會失敗)

回答

1

我想你可能自己回答了這個問題:

如果他們只能關聯與一個組的時間,做到這一點:

def add_reference 
    @product = Product.find(params[:product_id]) 
    @product.update_attribute("group_id", params[:group_id]) 
end 
+0

我忘了寫我已經嘗試過。在這種情況下,它表示找不到'update_attribute'方法。因此,我在Group模型中添加了'accept_nested_attributes_for:products'。儘管如此,它沒有奏效。我甚至允許從產品組控制器上調用update_attribute? – user1098655 2011-12-14 22:33:05

+0

感謝您的評論。您的評論幫助我弄清楚爲什麼我沒有收到@product。 – user1098655 2011-12-15 12:09:52

0

移動從一個組到另一個產品只需要一個簡單的事情:改變產品的group_id爲「指向「新組,即group_id列應繼續在改變後的新組織ID中。 Trip先生的回答顯示了實際的代碼。

0

我發現它爲什麼不起作用。

在我寫的上面的代碼中,collection_select本身返回一個散列。 因此:

@product = Product.find(params[:product_id]) 

不工作(因爲所有的請求參數也都在哈希)。

我有什麼做的是訪問遞歸散列(不知道這個詞是正確的),如:

@product = Product.find(params[:params][:product_id]) 

或者,使用那裏,而不是找到像:

@product = Product.where(params[:params]).limit(1) 

和有用!!

謝謝你的所有意見。這讓我繼續努力。