我被这个应用程序卡住了)我有 3 个模型 - 用户、照片和喜欢 用户将登录、查看照片并将它们标记为“喜欢”或“不喜欢”。这是我的 DB 架构,忽略了一些无关紧要的字段:
create_table "likes", :force => true do |t|
t.integer "oid" # oid is photos.id
t.integer "user_id" # user who liked this photo
t.boolean "mark", :default => true
end
create_table "photos", :force => true do |t|
t.string "photo" #filename of the photo
end
create_table "users", :force => true do |t|
t.string "firstname",
t.string "lastname",
t.string "email",
end
这里的模型:
class Photo < ActiveRecord::Base
has_many :likes, :foreign_key => 'oid'
end
class Like < ActiveRecord::Base
belongs_to :photo
end
class User < ActiveRecord::Base
has_many :likes, :through => :photos
end
一张照片将有每个用户一个标记。即用户不能“喜欢”照片两次或更多次。
我希望用户在重新登录后能够看到他们给出了估计的照片。
现在,我使用以下语句选择照片:@photos = Photo.limit(30).offset(0) 然后在模板中:<%= photo.likes.where("user_id=#{current_user.id}") %>在此之后,我有 30 多个 SQL 查询,或者换句话说,有 N+1 个问题。
避免该问题的一种选择是在选择照片时包括喜欢。
@photos = Photo.includes(:likes ).limit(30).offset(0)
但这将包括所有用户对照片的所有喜欢,并对应用程序的性能产生不利影响。另外,我必须为当前用户提取记录。
第二种选择是创建动态关系
class User < ActiveRecord::Base
has_many :likes, :through => :photos, :conditions => "user_id = current_user.id"
end
对于这个选项,我必须将 current_user.id 从控制器传递到模型,这对我来说看起来不正确。
请帮助解决这个问题