如何根据模型属性设置关联class_name



我有以下型号:

class Schematic < ApplicationRecord
belongs_to :branch, foreign_key: :location_cd
has_many :schematics_stocks, class_name: 'SchematicsStock', dependent: :destroy
end
class SchematicsStock < ApplicationRecord
belongs_to :schematic
belongs_to :stock, foreign_key: "stock_no"
end
class Stock < ApplicationRecord
self.table_name = 'stockslc'
self.primary_key = 'stock_no'
has_one :schematics_stock
end

有各种库存表(stockslc,stockalb等)基于原理图的location_cd(slc,alb等)。有什么方法可以做schematic.schematics_stocks[0].stock并让它自动选择正确的股票表吗?

我想过为每个股票表创建一个模型。在原理图股票类中,我可以做

Object.const_get("Stock#{schematic.location_cd.downcase}").find(stock_no)

但这会在数据库中查询每个库存号,而以前它只对所有原理图进行一次数据库调用。

我研究了 ActiveRecord 关联扩展,看看是否可以在定义schematics_stocks的同时根据location_cd定义belongs_to库存方法。类似的东西

class Schematic < ApplicationRecord
belongs_to :branch, foreign_key: :location_cd
has_many :schematics_stocks, class_name: 'SchematicsStock', dependent: :destroy do
belongs_to stock, class_name: "Stock#{location_cd.downcase}"
end
end

这似乎是使用 Postgresql 表分割的绝佳机会,我可以根据location_cd对库存表进行分区,但更改库存模式不是一种选择,并且其他表中已经有很多生产数据。

在我看来,我有如下代码。

<% @schematic.schematics_stocks.includes(:stock)
.order(:stock_no).each do |s_stock| %>

我正在尝试决定是否应该编写一个查询以从正确的表中获取它,然后重写我的视图代码,或者是否有办法使我的视图代码保持不变。

也许下面是一个工作,如果你只是想提高SQL的效率?

class Schematic < ApplicationRecord
has_many :schematic_stocks, dependent: :destroy
def stocks
# say if `location_cd` == 'alb', then
# you'll need to create a model named Stockalb in your app/models
# and a model for each "stock table" you have.
stock_class = ('Stock' + location_cd).constantize
stock_class.joins(:schematic_stocks)
end
end

我意识到我可以在运行时设置模型的table_name。最初我使用以下代码来使用正确的库存表

<% Stock.table_name = "stock" + @schematic.location_cd.downcase %>
<% @schematic.schematics_stocks.includes(:stock)
.order(:stock_no).each do |s_stock| %>

根据Jay-Ar Polidario的回答,我决定在原理图中制作一种方法来改变table_name。

# schematic.rb
def schematics_stocks_with_stocks
Stock.table_name = 'stock' + location_cd.downcase
schematics_stocks.includes(:stock)
end
# view 
<% @schematic.schematics_stocks_with_stocks
.order(:stock_no).each do |s_stock| %>

最新更新