2014-01-26 81 views
0

我有點問題。我一直在開發一個Rails應用程序,並遇到了一個我無法修復的問題。Rails 2 way association not functioning

截至目前,我的應用程序允許用戶輸入產品詳細信息到數據庫(存儲在「產品表」中)。下面是我正在使用的數據庫的模式。

ActiveRecord::Schema.define(version: 20140126073333) do 

    create_table "ijns", force: true do |t| 
    t.integer "number" 
    t.integer "product_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "quantity" 
    end 

    add_index "ijns", ["number"], name: "index_ijns_on_number" 

    create_table "products", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "ijn_id" 
    end 

    add_index "products", ["name"], name: "index_products_on_name" 

end 

還有一個名爲'ijns'的表,它爲每個產品分配一個唯一的標識符。這個ijn並沒有被有意地作爲主鍵,因爲我不希望它是一個自動遞增的值。

的B/W和IJN產品的關係爲:

甲產物的has_many ijns和 belongs_to的一個產品相關的IJN。

這裏是我的產品

class Product < ActiveRecord::Base 
    has_many :ijns 
    validates :name, presence: true, length: { minimum: 10 }, uniqueness: true 
end 

爲日本海軍型號的模型。

class Ijn < ActiveRecord::Base 
    belongs_to :product 

    validates :number, presence: true, uniqueness: true, length: { is: 4 }, numericality: { only_integer: true } 
    validates :product_id, presence: true 
    validates :quantity, presence: true 
end 

我能夠從日本海軍方面取得的關聯,即,我能夠通過使用類似訪問的產品型號中的字段:

@ijn.product.name 

但我不是能夠從產品型號中訪問'ijns'表的'數字'字段

我希望我在解釋我的問題時已經很清楚。如果需要其他信息,請告訴我。急切地等待一些回覆! :)

月1日編輯:

當我看到在sqlite3的數據庫瀏覽我的「產品」表中,ijn_id列存在,但由於某些原因沒有條目。下面是截圖:

Products Table in Database Browser

IJN table in Database Browser

+2

你有什麼試過?如果你寫'@ product.ijns',你會得到什麼?一個'NoMethodError'或其他東西? –

+0

Yeah Robin,我得到一個NoMethodError – vjrngn

回答

0
puts Product.first.ijn.number 

這要根據你想要做什麼工作。

+0

嘿@murrekatt,我試過,但是再次,我得到:「NoMethodError:undefined method'ijn'for#」 – vjrngn

1

問題是,您已經定義了一個Producthas_many:ijns。這與您在架構中具有ijn_id的產品相沖突。

因此,當您嘗試執行product.ijn時出現錯誤。

編輯:

如果產品真的有很多ijns然後ijn_id沒有意義的ActiveRecord和數據庫。他們不知道它應該指的是哪一個。我懷疑你希望它引用分配給產品的最後ijn。

在這種情況下,一種解決方案是將屬性更改爲current_ijn_id之類的內容。每次需要更新時,您都必須手動分配一個值。您可以選擇product.ijns.last。問題是你需要確保.last每次都會給你正確的ijn。例如,如果由於某種原因,您將產品「回滾」到舊的ijn,則可能無法正常工作。

+0

是的,這就是我的想法..我試過做產品.ijn_id ..這也不起作用..好吧..你有什麼建議我這樣做來解決這個問題?我需要2種方式訪問​​B/W表.. ijn.product.name工作..我需要'product.ijn.number'.. – vjrngn

+0

使協會一致。那麼'Product'有一個還是很多'Ijn's?如果有,將'has_many'改爲'has_one'。 ActiveRecord協會的基本知識:http://guides.rubyonrails.org/association_basics.html – jcm

+0

好吧,讓我只是在這裏清除一些東西。產品模型的實例只能有一個IJN,而IJN模型的實例只能有一個產品。但是,同樣的產品也可以在應用程序的生命週期中分配另一個IJN。這不是說一個產品擁有IJN嗎? – vjrngn

1

好像你正在做這個複雜得多,你需要:


ijn數量就像是一個SKU權(獨特的系統標識符)?因爲它是產品的屬性,你爲什麼不只是把它的產品表:

#products table 
id | ijn | name | created_at | updated_at 

這直接否定了額外的表的要求(也節省了查詢)


額外

如果你想調用額外的數據爲您product,你需要一個表專爲數據

對我而言,model是具有特定用途的數據集合。有一個模型ijn的不constutue這個

#app/models/products.rb 
Class Product < ActiveRecord::Base 
    has_one :profile, class_name: "ProductProfile" 
end 

#app/models/product_profile.rb 
Class ProductProfile < ActiveRecord::Base 
    belongs_to :product 
end 

這將允許你打電話像@product.profile.quantity或類似

+0

是的,我認爲如此以及..這就是爲什麼當我決定了我的數據庫應該採取的結構,我決定把我的產品放在一個單獨的表中,因爲它允許在我需要爲我的產品模型添加更多屬性的情況下擴展我的應用程序......這基本上是原因我使用了2個獨立的表格。此外,由於產品將通過應用程序生命週期不斷分配給新的獨特IJN值,因此最好將其放置在自己的表格中。 – vjrngn

0

非常感謝你的幫助......我做了一些更多的閱讀和發現我的解決方案..對於像我這樣的一對多關係,您只需要在一側提供引用表的'id',即在'ijn'表中包括'product_id'列。我刪除了'產品'表中的'ijn_id'列,並在我的'ProductsController'中包含了一行代碼。那就是:

... 
def show 
    @product = Product.find(params[:id]) 
    #getting the related IJN 
    @ijn = Ijn.find(:all, :conditions => ['product_id = ?',@product]) 
end 

... 

現在,在視圖中,相關的產品名稱可以通過簡單地做

<% @ijn.map do |i| %> 
    <tr> 
     <td><%=i.number %></td> 
     <td><%= i.quantity %></td> 
     <td><%= i.name %></td> #this returs the assocaiated product name 
     <td><%= Date::MONTHNAMES[i.product.created_at.month] %></td> 
     <td>placeholder</td> 
     <td>placeholder</td> 
    </tr> 
<% end %> 

它返回產品的名稱和相關IJNs清單作爲參考。我沒有添加任何樣式到我的代碼上面。

我希望這可以幫助其他面臨類似問題的人。