2015-12-10 31 views
1

我有一个带有album模型的画廊。检查用户是否查看过对象

我想保存当用户查看相册时,能够过滤掉用户没有看到的相册。

你会如何模型?

创建一个UserView,它是在我能想到的每个第一个视图上生成并存储的 - 但感觉像是要保存很多数据。

回答

1

不,这不是很多数据,因为您只需存储user_idalbum_id。以下是一个可让您存储相关数据的示例。它还确保您尝试存储的数据是唯一的。

class AlbumView < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :album 

    validates :user_id, presence: true, uniqueness: { scope: [:album_id] } 
end 

class User < ActiveRecord::Base 
    has_one :album_view 
end 

# Won't fail if view already exists 
AlbumView.create({ 
    user: current_user, 
    album: album 
}) 
+0

has_one:album_view,为什么只有一个? – davidwessman

1

我认为你有正确的想法。 Album型号可能为has_many :album_views。 然后你的User模型应该有一个has_many :album_views

然后在你的AlbumView模式,建立​​并创建一个迁移:

def change 
    create_table :album_view do |t| 
    t.integer :album_id 
    t.integer :user_id 

    t.timestamps null: false 
    end 
end 

因此,当用户查看相册,设置控制器调用自定义FindOrCreate方法会发现album_view,如果它存在该用户和相册,或者创建它。

为每个视图创建一个对象似乎很多,但数据很便宜。 :)