我正在尝试找出在关系具有多个作用域的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
仅接收食物照片。
我能想到的两种方法是:
使用多个联接表,并且每种类型的照片都有has_many与has_one关系。
为照片模型添加“类型”属性并编写作用域确定方法。
这两个对我来说似乎都很笨拙。 这里有更好的解决方案吗?
答案 0 :(得分:1)
我认为您必须进行 has_many 和单表继承(STI),如下所述。
restaurant
和photo
建立关联class Restaurant < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :restaurant
end
Photo
模型中使用STI。原因是您几乎拥有lounge_photos
和food_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') }