Rails Active Record Full Join

时间:2017-07-20 18:28:07

标签: ruby-on-rails activerecord ruby-on-rails-5

我有三张桌子:

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的“权重”列是显示顺序。

提前致谢!

1 个答案:

答案 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")

我希望这对你有所帮助。