I\'m implementing functionality to track which articles a user has read.
create_table \"article\", :force => true do |t|
t.string \"title\"
t.
The order does matter in indexing.
[:user_id, :article_id]
, you can perform a fast query on user_id
or user_id AND article_id
, but NOT on article_id
.Your migration add_index
line should look something like this:
add_index :user_views, [:user_id, :article_id]
An easy way to do this in Rails is to use validates
in your model with scoped uniqueness
as follows (documentation):
validates :user, uniqueness: { scope: :article }
Just a warning about checking uniqueness at validation time vs. on index: the latter is done by database while the primer is done by the model. Since there might be several concurrent instances of a model running at the same time, the validation is subject to race conditions, which means it might fail to detect duplicates in some cases (eg. submit twice the same form at the exact same time).