在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
并检索个人资料图片。
答案 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