我有三张桌子:
DataRow (id, user_id)
DataPoint (id, data_row_id, data_type_id)
DataType (id, name, weight)
我设置了以下关联:
data_row.rb
has_many :data_points
data_point.rb
belongs_to :data_row
belongs_to :data_type
在我看来,我想显示一个包含每个DataType列的表。我的问题是并非每个DataRow都包含每个DataType的DataPoint。
如果我执行以下操作,我将只获取该DataRow存在的DataPoints
@rows = DataRow.includes(:data_points).where(user_id: params[:id])
我是否有办法为每个用户为每个DataRow的每个DataType返回一个DataPoint,这样我就可以简单地遍历返回的DataRows? DataType的“权重”列是显示顺序。
提前致谢!
答案 0 :(得分:1)
在你的模型中添加:
<强> data_row.rb 强>
has_many :data_points
has_many :data_types, through: :data_points
<强> data_point.rb 强>
belongs_to :data_row
belongs_to :data_type
<强> data_type.rb 强>
has_many :data_points
has_many :data_rows, through: :data_points
你可以right joins
表。
DataRow.select('data_rows.*, data_types.*, data_points.*')
.joins("RIGHT JOIN data_points ON data_points.data_row_id = data_rows.id
RIGHT JOIN data_types ON data_types.id = data_points.data_type_id")
我希望这对你有所帮助。