【问题标题】:Flexible requests to database in Rails在 Rails 中对数据库的灵活请求
【发布时间】:2013-11-02 10:00:55
【问题描述】:

我在 Rails 中遇到以下问题,我不知道如何解决。我构建了一个测试网络应用程序,一个带有房地产广告的公告板,例如http://www.trulia.com/ 的简单版本,显然用户可以将广告添加到他们可以在他们的“办公室”中找到的网站,这就是问题出现的地方。我有 8 种类型的广告,如公寓、办公室、车库等,因此我需要能够检索属于某个特定用户的广告,并且我不想向所有 8 个表发出 sql 请求以显示该用户的广告,例如,如果用户只有 1 个关于出售公寓的广告。 所以我需要一些东西而不是

@garages = Garage.where("user_id = #{current_user.id}")
@flats = Flat.where("user_id = #{current_user.id}")
@offices = Office.where("user_id = #{current_user.id}")
..... and so on

我有用户模型,所以所有广告都属于某个用户,我正在考虑创建一个多态表,该表将属于用户并包含有关用户邀请的所有广告的信息 它将被命名,例如,“广告”,它将有 3 列,user_id、advertisable_id、advertiseble_type,并且很容易获取属于某个特定用户的所有行,但我不知道它是否可能让 Rails 只从“advertisable_type”中的那些表和“advertisable_id”中的那些表中获取广告,我希望你明白我的意思。那么,对新手有什么建议吗? :)

【问题讨论】:

    标签: mysql ruby-on-rails database activerecord


    【解决方案1】:

    如果您现有的模型 Garage、Flat、Office 真的是广告,共享许多相同的逻辑和列,那么显然您需要重新设计数据。

    如果 99% 相同,为什么不只使用 Advertisement 表和列 advertisement_type ?如果您想要广告类型的分类器,只需使用单独的表/模型 AdvertisementTypes 并在 advertisements 表中通过 advertisement_type_id 引用它们。

    如果您觉得有/将会有很多共同点,但也会有很多不同的逻辑,这可能是STI (Single table inheritance) 的理想案例。 使用 STI 时,您有不同的模型类,它们继承自同一个父类并存储在同一个表中。

    class Advertisement < ActiveRecord::Base
      def ad_text
        "We are selling property: #{read_attribute(:ad_text)}"
      end
    end
    
    class GarageAdvertisement < Advertisement
      def ad_text
        "We are selling garage: #{read_attribute(:ad_text)}"
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2016-08-21
      • 2011-04-05
      相关资源
      最近更新 更多