如何在应用程序模型中共同选择Rails引擎模型

时间:2014-03-12 21:13:54

标签: ruby-on-rails inheritance extend rails-engines

我有三个应用程序:网站,POS和经理。 Manager应用程序在根目录中安装了Manager Engine。 Manager引擎是对核心模型(事件,葡萄酒等)进行所有更新的地方。其他两个应用程序也安装了引擎,但它们充当了#34; slave引擎"。即,它们会定期与主管理器应用程序同步,但不允许更改manager_表中的数据。

我想知道合并的最佳方法是什么? Manager :: Wine对象中必要的属性到POS的Item对象。

项目包含category_id, barcode, name, price, sale_price, stock, force_price_negative, ...etc。其中一些属性与Manager :: Wine重叠,例如barcode, name, price, sale_price, stock。我希望Item对象从manager_wines表继承这些属性,但仅当category_id为1(Wines)时。一个项目可以属于任何其他类别,因此它不像所有项目都将使用manager_wines中的属性。

在我的头顶,最通用的'这样做的方法是在Item中有两个额外的属性(model, model_id ...其中model是Manager::Wine,id是manager_wines中的对应id。我只是不知道是否有更简单或更健壮的方法。

1 个答案:

答案 0 :(得分:0)

Whelp,我在解决方案中苦苦挣扎。

在项目模型中:

belongs_to :manager, :polymorphic => true

# Override local methods with Manager object methods
[:barcode, :name, :price, :sale_price, :stock, :taxed, :tax_included].each do |att|
    define_method(att) do
        if manager_id.blank?
            read_attribute(att)
        else
            manager.send(att)
        end
    end
end

在项目表格中,添加:

manager_id :integer  
manager_type :string

似乎工作正常。但有一点需要注意的是,如果由于某种原因我特意尝试使用order('categories.name'),那么急切加载多态关联会失败 - 即使类别表与引擎模型没有任何关系。不然它很好。