簡體   English   中英

Rails 2路關聯不起作用

[英]Rails 2 way association not functioning

我有點問題。 我一直在開發一個Rails應用程序,並遇到了一個我無法解決的問題。

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

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和Product的關系是:

產品has_many ijns和An ijn屬於一個產品。

這是我的產品模型

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

IJN的模型。

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方面獲得關聯,即,我可以通過使用以下內容訪問產品模型的字段:

@ijn.product.name

但是我無法從產品模型訪問'ijns'表的'number'字段

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

第一編輯:

當我在sqlite3數據庫瀏覽器中查看我的'products'表時,ijn_id的列存在,但由於某種原因,沒有條目。 這是一個截圖:

數據庫瀏覽器中的產品表

數據庫瀏覽器中的IJN表

問題是你已經定義了一個Product has_many :ijns 這與具有您架構中的ijn_id的產品沖突。

因此,當您嘗試執行product.ijn您會收到錯誤消息。

編輯:

如果產品真的有很多ijns,那么ijn_id對ActiveRecord和數據庫毫無意義。 他們不知道它應該引用哪個。 我懷疑你希望它引用分配給產品的最后一個ijn。

在這種情況下,一種解決方案是將屬性更改為類似current_ijn_id 每次需要更新時,您都必須手動分配值。

或者你可以做product.ijns.last 問題是你需要確保.last都會給你正確的ijn。 例如,如果由於某種原因你將產品“回滾”到舊的ijn,它可能不起作用。

似乎你讓這比你需要的更復雜:


您的ijn號碼就像SKU (您的系統的唯一標識符)對嗎? 由於它是產品的屬性,為什么不將它放在產品表中:

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

這立即否定了對額外表的要求(也保存了查詢)


額外

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

對我而言, model是具有特定目的的數據集合。 擁有ijn的模型並不能構成這一點

#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或類似的東西

puts Product.first.ijn.number

這應該根據你想要做的工作。

非常感謝你的幫助...我做了一些閱讀並找到了我的解決方案..對於像我一樣的一對多關系,你只需要在一邊提供引用表的'id',即包括'ijn'表中的'product_id'列。 我刪除了'products'表中的'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 %>

返回產品名稱和關聯的IJN列表。 我沒有在上面的代碼中添加任何樣式。

我希望這有助於其他遇到類似問題的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM