Rails:跨两列联接

格雷格·施瓦兹(Greg Schwartz)

我正在构建一个约会应用程序,并且正在创建一个表格(和模型)以供用户相互评分(喜欢/不喜欢)。我支持多种性别,所以我不想简单地包含“男人的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
米尔科·卡塔布里加(Mirco Cattabriga)

如果未指定外键,则将查找默认的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.firstuser.ratings2.first

要同时显示两者,您需要使用以下方法:

def all_user_ratings
  Rating.where("user1 = ? OR user2 = ?", user.id, user.id)
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何跨组结果跨两列

来自分类Dev

处理两列值的两表联接

来自分类Dev

处理两列值的两表联接

来自分类Dev

大熊猫:拆分值并跨列联接

来自分类Dev

动态添加控件时跨两列

来自分类Dev

如何基于两列联接数据框架

来自分类Dev

相同联接的两列的INNER JOIN

来自分类Dev

MySQL,两列共享相同的联接

来自分类Dev

相同联接的两列的INNER JOIN

来自分类Dev

匹配跨两行两列的项目

来自分类Dev

如何使用PDO跨两个数据库运行带有联接的查询

来自分类Dev

联接:两个文件-但仅追加最后两列

来自分类Dev

根据两列联接两个表

来自分类Dev

SQL Server跨表联接

来自分类Dev

多个联接和跨乘法

来自分类Dev

如何跨SQL / PostgreSQL中的两列获取MAX值

来自分类Dev

对跨两列重复项的 MySql 删除使用 LIMIT

来自分类Dev

如何联接两个表,多次使用特定的列

来自分类Dev

从表中选择列与联接两个表

来自分类Dev

在已透视的数据框中联接两列

来自分类Dev

根据不同的列联接两个表

来自分类Dev

尝试联接两个查询并检索列

来自分类Dev

SQL针对多个列联接两个表

来自分类Dev

pgSQL:两列的完全外部联接省略了行

来自分类Dev

用混合列联接两个表

来自分类Dev

使用左外部联接联接两个表,并根据右表列填充新的列值

来自分类Dev

当联接列具有不同的名称时,如何联接两个表?

来自分类Dev

在AWK中联接两个文件-联接列在不同位置

来自分类Dev

如何基于awk / Bash程序的前两列联接两个大文件?