HABTM关系,如何为id输入多个值?

时间:2013-03-23 04:22:43

标签: ruby-on-rails

我有一个用户模型,其中包含了很多资产组合,其中包含了__资产管理资产的资产。

基本上,用户1可能在其投资组合中使用Google,而用户2也可能在其投资组合中使用Google。为什么当我可以拥有多对多(HABTM)关系时,为什么使用重复的Google股票价格历史记录来填充数据库。然而,抛出我的是当AssetHistory模型中的asset_id为多个值时,该怎么办。即它需要引用用户1和用户2.用户1的Google可能是asset.id 1而用户2的Google可能是asset.id 2.因此,AssetHistory模型中的条目如何引用这两个ID?

似乎很清楚,asset_id不能同时为2个值,但我无法解决这个问题。我应该使用foreign_key并将Google作为关键吗?如果是这样,我的资产模型中仍然存在问题,即为Asset_History_id输入什么条目,因为资产Google可能有30行股票价格历史记录。每个股票价格历史记录都是不同的Asset_History_id。

有人可以帮助解释我做错了吗?

请注意,我在资产模型中使用after_save来填充资产价格历史记录。即当有人添加资产时,它会填充asset_history,但它不会填充Asset模型中的asset_history_id字段,也不会填充AssetHistory模型中的asset_id,因为我在那里做了什么。 / p>

我的资产模型有:

class Asset < ActiveRecord::Base
attr_accessible :asset_symbol, :shares, :cost, :date_purchased, :asset_history_id 
belongs_to :portfolio    
has_and_belongs_to_many :asset_histories


after_save populatepricehistory

private
   def populatepricehistory
         #uses an api to download price data as an array and imports it to AssetHistory...
         #I expect something should go here to fill out the asset_history_id field in the Asset Model
         #while simultaneously filling out the asset_id in the AssetHistory model

   end
end

资产历史模型

class AssetHistory < ActiveRecord::Base
    attr_accessible :close, :date, :asset_id, :asset_symbol
    has_and_belongs_to_many :assets
end

AssetHistoryAsset连接表的迁移

class AssetHistoryAssetJoinTable < ActiveRecord::Migration
  def up
    create_table :asset_histories_assets, :id=> false do |t|
        t.integer :asset_id
        t.integer :asset_history_id
    end
  end

  def down
    drop_table :asset_histories_assets
  end
end

1 个答案:

答案 0 :(得分:1)

我的建议是:

class User < ActiveRecord::Base
  has_many :assets, :through => :porfolios
  has_many :porfolios
end

class Porfolio < ActiveRecord::Base
  has_many :assets
  has_many :users
end

class Asset < ActiveRecord::Base
  has_many :users, :through => :portfolios
  has_many :portfolios
  has_and_belongs_to_many :asset_histories
end

顺便说一句,你真的需要AssetAssetHistory之间的多对多关系吗?我想象AssetHistory的每个实例只能引用一个Asset,可能是belongs_to :asset / has_one :asset_history