在 Rails 中选择 has_many 关系之一

Selecting one of a has_many relation in Rails

从 has_many 关系中为 Rails 中的特定模型选择特定记录的首选方法是什么? (我正在使用 Rails 5。)

我有一个模型 User 和一个模型 Picture,它们通过以下代码关联:

class User < ApplicationRecord
  has_many :pictures, as: :imageable
  # ...
end

class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
  # ...
end

我想要做的是允许 User 从与其关联的图像中设置个人资料图片,这样我就可以在 User 对象上调用 @user.profile_picture 并检索头像。

您可以添加额外的一对一关系。

# create by running:
# rails g migration AddPrimaryPictureToUser
class AddPrimaryPictureToUser < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :primary_picture_id, :integer
    add_index :users, :primary_picture_id
    add_foreign_key :users, :pictures, column: :primary_picture_id
  end
end

class User < ApplicationRecord
  has_many :pictures, as: :imageable
  # This should be belongs_to and not has_one as the foreign key column is 
  # on the users table
  belongs_to :primary_picture, 
             class_name: 'Picture',
             optional: true
end


class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
  has_one :primary_user, 
          foreign_key: 'primary_picture_id',
          class_name: 'User'
  # ...
end

这样做的主要原因与例如 pictures table 上的布尔标志相比是因为拥有单独的关系可以很容易地加入,这对于避免 N+1 很重要如果您要列出一群用户及其主要图片,那么查询就会成为一个问题。

@users = User.includes(:primary_picture).all