在Rails中对数据库的灵活请求

时间:2013-11-02 10:00:55

标签: mysql ruby-on-rails database activerecord

我在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”中的那些ID,我希望你理解我的意思。那么,对新手的任何建议? :)

1 个答案:

答案 0 :(得分:0)

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

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

如果您觉得有/将会有很多共同点,但也会有很多不同的逻辑,它可能是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