在Rails中选择一个has_many关系

时间:2016-11-22 10:57:19

标签: ruby-on-rails associations ruby-on-rails-5 activemodel

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以添加其他一对一关系。

# 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表上的布尔标志相比,具有单独的关系使得连接变得容易,这对于避免N + 1查询很重要,这是一个问题,如果你列出了一堆用户和他们的主要形象。

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