我正在构建一个约会应用程序,并且正在创建一个表格(和模型)以供用户相互评分(喜欢/不喜欢)。我支持多种性别,所以我不想简单地包含“男人的ID”和“女人的ID”列。但是,这意味着我仅拥有两个用户ID,并且需要同时搜索当前用户的ID。
我设法使迁移正常工作,但没有使实际的课程正常工作。我不知道如何告诉Rails搜索这两列。
评分迁移:
class CreateRatings < ActiveRecord::Migration[6.0]
def change
create_table :ratings do |t|
t.references :event, null: false, foreign_key: true
t.references :user1, index: true, null: false, foreign_key: {to_table: :users}
t.references :user2, index: true, null: false, foreign_key: {to_table: :users}
t.timestamps
end
end
end
评分模型:
class Rating < ApplicationRecord
belongs_to :event
belongs_to :user1, class_name: "User"
belongs_to :user2, class_name: "User"
end
当我在irb中尝试时,我得到:
irb(main):003:0> User.first.ratings
User Load (3.0ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1 [["LIMIT", 1]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column ratings.user_id does not exist)
LINE 1: SELECT "ratings".* FROM "ratings" WHERE "ratings"."user_id" ...
^
HINT: Perhaps you meant to reference the column "ratings.user1_id" or the column "ratings.user2_id".
irb(main):004:0>
这是否仅需要排除在Rails协会范围之外?例如,我应该在User类中定义一个方法来获取匹配的记录Ratings.user1=User.id OR Ratings.user2=User.id
吗?
我正在使用Postgres数据库,如果可以的话,可以使用任何出色的解决方案。
用户迁移:
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false
<snip>
t.timestamps
end
add_index :users, :email, unique: true
end
end
用户模型
class User < ApplicationRecord
has_many :ratings
end
如果未指定外键,则将查找默认的user_id,但它不存在,因此会出现错误消息。因此,您可以执行以下操作:
class Rating < ApplicationRecord
belongs_to :event
belongs_to :user1, class_name: "User", :foreign_key => 'user1'
belongs_to :user2, class_name: "User", :foreign_key => 'user2'
end
class User < ApplicationRecord
has_many :ratings1, foreign_key: :user1, class_name: 'Rating'
has_many :ratings2, foreign_key: :user2, class_name: 'Rating'
end
那你可以做
user.ratings1.first
和 user.ratings2.first
要同时显示两者,您需要使用以下方法:
def all_user_ratings
Rating.where("user1 = ? OR user2 = ?", user.id, user.id)
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句