2013-04-29 63 views
0

如何從關聯表單中獲取數據並將其插入到主模型的關聯表中?Rails從關聯表格中保存數據

class Supplier < ActiveRecord::Base 
    has_one :account, foreign_key: "acc_sup_id", :autosave => true 
    self.primary_key = 'sup_id' 
end 

class Account < ActiveRecord::Base 
    belongs_to :supplier, foreign_key: "acc_sup_id" 
    self.primary_key = 'acc_id' 
    self.table_name = 'accounts' 
end 

我有一個供應商和帳戶的組合形式。當我提交時,我需要找到一種方法將相應的值插入供應商和賬戶。問題是供應商值插入正確,但沒有帳戶。

我在幾個論壇,團體,甚至在堆棧中都問過同樣的問題,但似乎沒有人給出令人信服的答案。

回答

0

基本策略是首先查看提交表單時提交的參數。您可以在控制器操作中添加一行,如raise params.inspect以查看該行。確保這些部分包含您需要的所有數據;如果不是,那麼在視圖中就會產生一些問題來生成該表單。

將所有數據傳送到控制器操作後,您需要更改控制器操作,以便正確解釋所有數據並將其放入正確的模型中。

我不能給出任何更具體的建議,除非您顯示您的視圖的代碼,做params.inspect的結果,以及控制器採取數據操作的代碼。

+0

我使用netzke作爲我的表單視圖,在我的控制器中沒有代碼。當我在模型中**提出self.inspect **時,我得到了參數{}中的所有值。我可以給出解決這個問題所需的任何數量的澄清。 – ejo 2013-04-29 07:05:15

0

試試這個。

我們假設有orderscustomers表,並且您希望從訂單表單中對客戶執行CRUD操作。

客戶模式很簡單

class Customer < ActiveRecord::Base 
    attr_accessible :name 
end 

Order模型必須對所有客戶的屬性(attr_accessor構建)提供虛擬屬性。通過回調來提供customers的CRUD。驗證也可以使用。

class Order < ActiveRecord::Base 
    attr_accessor :customer_name 
    attr_accessible :description, :number, :customer_name 
    belongs_to :customer 

    validates_presence_of :number 
    validates_presence_of :description 
    validates_presence_of :customer_name 

    before_save :save_customer 
    after_find :find_customer 
    after_destroy :destroy_customer 

    protected 

    def save_customer 
    if self.customer 
     self.customer.name = self.customer_name 
    else 
     self.customer = Customer.create(name: self.customer_name) 
    end 
    self.customer.save 
    end 

    def find_customer 
    self.customer_name = self.customer.name 
    end 

    def destroy_customer 
    self.customer.destroy 
    end 
end 

Order model的示例網格。

class Orders < Netzke::Basepack::Grid 
    def configure(c) 
    super 
    c.model = 'Order' 
    c.items = [ 
     :description, 
     :number, 
     :customer_name 
    ] 
    c.enable_edit_inline = false 
    c.enable_add_inline = false 
    end 

    def preconfigure_record_window(c) 
    super 
    c.form_config.klass = OrderForm 
    end 
end 

Order model的示例窗體。

class OrderForm< Netzke::Basepack::Form 
    def configure(c) 
    super 
    c.model = 'Order' 
    c.items = [ 
     :description, 
     :number, 
     :customer_name 
    ] 
    end 
end 
+0

感謝您的詳細回覆。但是我在詢問關於rails默認方法來完成這個任務。這可以通過創建虛擬屬性並將值傳遞給默認關聯來完成。你的回答幫助我以不同的方式瞭解這個過程。 – ejo 2013-06-10 07:09:17