在同一模型之间使用多个has_many关系

时间:2019-05-09 04:42:56

标签: sql ruby-on-rails relational-database

我正在尝试找出在关系具有多个作用域的rails中建立多对一关系的最佳方法。

一个例子是一家餐馆有很多照片。我希望能够打电话

public static void showNames() throws SQLException {
        Statement stmt=null;
        Connection conn=null;
        try {
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            stmt = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        String selectTable="SELECT * FROM userInfo;";
        stmt.execute(selectTable);
    }

,仅接收休息室的照片, 但也可以打电话

restaurant.lounge_photos

仅接收食物照片。

我能想到的两种方法是:

  1. 使用多个联接表,并且每种类型的照片都有has_many与has_one关系。

  2. 为照片模型添加“类型”属性并编写作用域确定方法。

这两个对我来说似乎都很笨拙。 这里有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我认为您必须进行 has_many 单表继承(STI),如下所述。

  1. restaurantphoto建立关联
class Restaurant < ActiveRecord::Base
 has_many :photos
end

class Photo < ActiveRecord::Base
 belongs_to :restaurant
end
  1. 然后,您必须在Photo模型中使用STI。原因是您几乎拥有lounge_photosfood_photos的所有字段。

OR

直接使用范围可以区分它并实现您的目标。

有关使用STI的更多详细信息,请参阅this link

答案 1 :(得分:0)

这是使用type列的一种方式

has_many :food_photos, 
         class_name: 'Photo', 
         foreign_key: :restaurant_id, 
         -> { where(type: 'food') }

has_many :lounge_photos, 
         class_name: 'Photo', 
         foreign_key: :restaurant_id, 
         -> { where(type: 'lounge') }