Tag: 单表inheritance

来自Rails 4中动态表单参数的sti类型

我希望将一个sti基类作为参数传递,然后能够从该查询中调用所有子类。 br /这是我的STI课程和子课程。 class LivingThing < ActiveRecord::Base end class Animal < LivingThing end class Plant < LivingThing end class Fungus < LivingThing end class Cat < Animal end class Dog < Animal end 我想通过一个名为“living_thing_type”的渲染表单传递一个参数,所以我可以这样做: living_things = living_thing_type.all 但即使我尝试这个 living_thing_type.constantize.all 我收到此错误: undefined method `all’ for “Animal”:String

如何构建这一点,以便从STI获得所有好处而不会产生什么后果? (我知道,这是不负责任的。)

假设我在Rails应用程序中有以下关联示例: 我正在考虑将STI下的* Posting模型结合起来。 STI的一个问题是许多属性的可能性仅与一个子类相关(即,许多非规范化的nil值)。 当你的子类和未来的发展和成长时,这尤其令人担忧。 我已经阅读了一些相关的post(例如这个 ),但是,正如您在我的示例中所看到的,潜在的子类特定字段不一定只是属性,而是很多belongs_to关联。 我的问题是,如何重构这个以使用来自Posting模型的STI来获取所有常见属性/方法(在我的实际应用程序中会有相当多的属性/方法),但保留特定的子类特定属性和belongs_to关联来自堆积在Posting模型中? 此外,访问@board.postings并使用这些标准方法的能力非常重要。 例如,我考虑过将特定于类型的属性移动到另一个模型: class CarPosting < Posting has_one: car_posting_detail end class CarPostingDetail < ActiveRecord::Base belongs_to :car_posting belongs_to :car_make belongs_to :car_model end 虽然,这开始创建了很多连接,但我不确定我是否在正确的方向上有has_one / belongs_to声明,并且你必须开始链接调用(例如, @posting.car_posting_detail.car_make )。 您是否还有其他设计模式可以实现此目的?

Rails STI,子类除非使用否则不显示?

我正在使用Rails STI来建模复杂域。 在视图中,我列出了所有子类: > > 目的是最终使子类的每个标签成为该子类实例的单个“索引”页面的链接。 这使我免于必须自己拥有所有可能的子类列表(如果我添加更多,则稍后更新它)。 但是,我注意到只有那些我从数据库中实际加载的子类才显示在列表中。 如果我说StateDescription.all,那么所有现有的子类都会显示(但是没有任何实例没有实例)。 如果我改为询问所有特定的子类,那么只显示该子类。 我想这是我听过的“懒加载”的一部分。 是吗? 它看起来像问题是如果我不从数据库中获取特定的“类型”,即使我有一个模型,它可能也不存在? 有没有解决方法,或者我注定要为我创建的每个子类写出一个链接? 编辑: 在控制台上,如果我键入 StateDescription.subclasses.count 我得到0。 如果我然后执行StateDescription.all和THEN StateDescription.subclasses.count,我得到14。

Rails attr_accessible不适用于:type?

我尝试在表单中设置单表inheritance模型类型。 所以我有一个属性的选择菜单:类型,值是STI子类的名称。 问题是错误日志保持打印: 警告:无法批量分配这些受保护的属性:类型 所以我在模型中添加了“attr_accessible:type”: class ContentItem < ActiveRecord::Base # needed so we can set/update :type in mass attr_accessible :position, :description, :type, :url, :youtube_id, :start_time, :end_time validates_presence_of :position belongs_to :chapter has_many :user_content_items end 不改变任何东西,在控制器中调用.update_attributes()之后,ContentItem仍然具有:type = nil。 知道如何从表单中大量更新:type?

单表inheritance与Rails中的工厂女孩

我正在使用FactoryGirl和FactoryGirl制作Rails 4.0.1应用程序,但我无法让我的测试正常工作。 我正在使用单表inheritance来创建Collection < ActiveRecord::Base和VideoCollection < Collection模型。 在我的测试中使用Factory Girl时,模型似乎没有像他们应该那样实例化。 细节: 当我在浏览器中直观地检查我正在测试的视图时,它会正确显示集合。 当我在测试中为同一视图运行print page.html时,该集合不会出现在页面代码中。 如果我使用rails c test进入测试控制台并执行FactoryGirl.create(:video_collection) ,那么video集合就会插入到数据库中没问题。 代码: 我的模特: # ——in app/models/collection.rb—— class Collection < ActiveRecord::Base end # ——in app/models/video_collection.rb—— class VideoCollection < Collection end # ——in db/schema.rb—— create_table "collections", force: true do |t| t.string "type" t.datetime "created_at" t.datetime "updated_at" t.string "name" t.string "tile_image_link" end […]

不同的路由,但在Rails中使用相同的控制器进行模型子类

我有一个Model属性,它有使用STI的子类, 并且我希望所有人都使用相同的控制器,只有不同的视图部分取决于子类。 Property Restaurant < Property Landmark < Property 除了我不确定如何辨别控制器内的子类以呈现正确的视图之外,它还可以工作。 IE浏览器。 /餐厅工作,并去物业控制器,但我不能告诉他们,他们想要餐厅的子类? map.resources :restaurant, :controller => :properties map.resources :properties

RTI中的STI Inheiritance。 查找问题

由于我的inheritance结构,我在搜索STI表中的记录时遇到问题 class User < ActiveRecord::Base class LegacyUser < User class AuthUser < User class SuperUser < AuthUser class FieldUser < AuthUser class ClientAdmin < AuthUser 问题是find不适用于AuthUser Model。 查询正在查找类型“AuthUser”,并且不包括其他三种可能性。 编辑:在玩这个时,它开始工作,但仅适用于ClientAdmin和FieldUser,因此似乎应该内置此function。但现在它已回到原始问题

使用具有相同控制器的STI路径

我正在使用STI,我想知道,我是否必须为每个型号配备一个单独的控制器? 我有一种情况,我只在STI关系中使用一个模型的创建和编辑操作,但如果我尝试为其执行表单,则会出现“未定义的方法”错误。 更具体地说,我有两个inheritance自List的模型: class RegularList < List class OtherList < List 我有一个处理这些操作的列表控制器,但我只使用表单创建带有RegularList的新模型。 即我使用form_for创建新的List对象的唯一情况是使用RegularList。 我想做的是: class ListsController < ApplicationController def new @list = RegularList.new end 否则创建新列表的路径看起来像regular_list / new,但我希望它只是list / new。 思考? 编辑:问题是当我使用上面的代码时,我得到一个’未定义的方法’错误。 我的观点如下: … 所以似乎在Lists控制器中使用RegularList对象存在一些问题,这是我试图解决的主要问题。 对不起,我意识到这不是最清楚的解释。

如何让Rails 3在开发模式下重新加载STI类?

切换到Rails 3后,我注意到我必须重新启动服务器才能使每个请求重新加载STI模型类。 例如,假设我有这个: # app/models/vehicle.rb class Vehicle < ActiveRecord::Base end # app/models/car.rb class Car < Vehicle end 如果我对Vehicle进行了更改,则会在下一个请求中加载更改。 但是,如果我对Car进行更改,我必须重启我的服务器才能加载。 有关解决这个问题的想法? 我正在运行WEBrick,但我并没有承诺。

如何在单表inheritance中运行子类的validation?

在我的应用程序中,我有一个名为Budget的类。 预算可以有多种类型。例如,假设有两个预算:FlatRateBudget和HourlyRateBudget。 两者都inheritance自预算class。 这是我到目前为止所得到的: class Budget < ActiveRecord::Base validates_presence_of :price end class FlatRateBudget < Budget end class HourlyRateBudget < Budget validates_presence_of :quantity end 在控制台中,如果我这样做: b = HourlyRateBudget.new(:price => 10) b.valid? => false b.errors.full_messages => [“Quantity can’t be blank”] 正如所料。 问题是STI上的“类型”字段来自params ..所以我需要做类似的事情: b = Budget.new(:type => “HourlyRateBudget”, :price => 10) b.valid? => true 这意味着rails在超类中运行validation,而不是在我设置类型后实例化子类。 我知道这是预期的行为,因为我正在实例化一个不需要数量字段的类,但我想知道是否还有告诉rails运行子类的validation而不是super。