Ruby on rails Rails 4.2中的关系:1对多或2对1

Ruby on rails Rails 4.2中的关系:1对多或2对1,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,Rails Activerecord,我将如何描述它的工作原理: 用户Alice可以启动与另一个用户的交换。因此,Alice是这个交换的发起用户,Bob是被请求的用户 一个用户可以有许多交换s 一个交换有一个发起用户和一个请求用户。 我不确定这是一对一关系还是一对多关系,因为两者都属于用户,但地址不同 一个交易所正好有两个评级s,但与以前相同的问题也适用。我不知道这是一对一还是一对多的关系。 发起用户和请求用户中的每一个都可以进行评分。 然后分别是启动用户评级或请求的用户评级 一个评级只属于一个交易所 我的问题: 我几乎可以肯定,有

我将如何描述它的工作原理:

用户
Alice可以启动与另一个
用户的
交换
。因此,Alice是这个
交换的发起用户,Bob是被请求的用户

一个
用户
可以有许多
交换
s

一个
交换
有一个
发起用户
和一个
请求用户
。 我不确定这是一对一关系还是一对多关系,因为两者都属于
用户
,但地址不同

一个
交易所
正好有两个
评级
s,但与以前相同的问题也适用。我不知道这是一对一还是一对多的关系。
发起用户
请求用户
中的每一个都可以进行
评分
。 然后分别是
启动用户评级
请求的用户评级

一个
评级
只属于一个
交易所

我的问题:

我几乎可以肯定,有一种比我现在使用的方法简单得多的方法,可能只是使用
ActiveRecord
关系。 它现在起作用了,但我对它不满意

所以我想我的问题是:

  • 那些
    启动用户
    /
    请求的用户
    启动用户评级
    /
    请求的用户评级
    关系是否都是1对多 还是两个1比1
  • 有没有更好的方法来建立这个星座的关系
  • 如果不是的话,我如何让结构变得不那么粗糙而更像rails-y
不是真正的UML:

代码:

app/models/user.rb中

# Exchanges
has_many :initiated_exchanges, class_name: "Exchange",
                               foreign_key: "init_user_id"
has_many :requested_exchanges, class_name: "Exchange",
                               foreign_key: "req_user_id"
# Ratings
has_many :init_user_ratings, through: :initiated_exchanges
has_many :req_user_ratings, through: :requested_exchanges
# Users
belongs_to :init_user, class_name: "User",
                       foreign_key: "init_user_id"
belongs_to :req_user, class_name: "User",
                      foreign_key: "req_user_id"
# Ratings
belongs_to :init_user_rating, class_name: "Rating",
                              foreign_key: "init_user_rating_id"
belongs_to :req_user_rating, class_name: "Rating",
                             foreign_key: "req_user_rating_id"
def exchange
  Exchange.find_by("init_user_rating_id=? or req_user_rating_id=?", id, id)
end
create_table "exchanges", force: :cascade do |t|
  t.integer  "init_user_id",        null: false
  t.integer  "req_user_id",         null: false
  t.integer  "init_user_rating_id"
  t.integer  "req_user_rating_id"

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end

create_table "ratings", force: :cascade do |t|
  t.integer  "rating"
  t.text     "text",                limit: 1000

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end
app/models/exchange.rb

# Exchanges
has_many :initiated_exchanges, class_name: "Exchange",
                               foreign_key: "init_user_id"
has_many :requested_exchanges, class_name: "Exchange",
                               foreign_key: "req_user_id"
# Ratings
has_many :init_user_ratings, through: :initiated_exchanges
has_many :req_user_ratings, through: :requested_exchanges
# Users
belongs_to :init_user, class_name: "User",
                       foreign_key: "init_user_id"
belongs_to :req_user, class_name: "User",
                      foreign_key: "req_user_id"
# Ratings
belongs_to :init_user_rating, class_name: "Rating",
                              foreign_key: "init_user_rating_id"
belongs_to :req_user_rating, class_name: "Rating",
                             foreign_key: "req_user_rating_id"
def exchange
  Exchange.find_by("init_user_rating_id=? or req_user_rating_id=?", id, id)
end
create_table "exchanges", force: :cascade do |t|
  t.integer  "init_user_id",        null: false
  t.integer  "req_user_id",         null: false
  t.integer  "init_user_rating_id"
  t.integer  "req_user_rating_id"

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end

create_table "ratings", force: :cascade do |t|
  t.integer  "rating"
  t.text     "text",                limit: 1000

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end
app/models/rating.rb中

# Exchanges
has_many :initiated_exchanges, class_name: "Exchange",
                               foreign_key: "init_user_id"
has_many :requested_exchanges, class_name: "Exchange",
                               foreign_key: "req_user_id"
# Ratings
has_many :init_user_ratings, through: :initiated_exchanges
has_many :req_user_ratings, through: :requested_exchanges
# Users
belongs_to :init_user, class_name: "User",
                       foreign_key: "init_user_id"
belongs_to :req_user, class_name: "User",
                      foreign_key: "req_user_id"
# Ratings
belongs_to :init_user_rating, class_name: "Rating",
                              foreign_key: "init_user_rating_id"
belongs_to :req_user_rating, class_name: "Rating",
                             foreign_key: "req_user_rating_id"
def exchange
  Exchange.find_by("init_user_rating_id=? or req_user_rating_id=?", id, id)
end
create_table "exchanges", force: :cascade do |t|
  t.integer  "init_user_id",        null: false
  t.integer  "req_user_id",         null: false
  t.integer  "init_user_rating_id"
  t.integer  "req_user_rating_id"

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end

create_table "ratings", force: :cascade do |t|
  t.integer  "rating"
  t.text     "text",                limit: 1000

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end
app/db/schema.rb

# Exchanges
has_many :initiated_exchanges, class_name: "Exchange",
                               foreign_key: "init_user_id"
has_many :requested_exchanges, class_name: "Exchange",
                               foreign_key: "req_user_id"
# Ratings
has_many :init_user_ratings, through: :initiated_exchanges
has_many :req_user_ratings, through: :requested_exchanges
# Users
belongs_to :init_user, class_name: "User",
                       foreign_key: "init_user_id"
belongs_to :req_user, class_name: "User",
                      foreign_key: "req_user_id"
# Ratings
belongs_to :init_user_rating, class_name: "Rating",
                              foreign_key: "init_user_rating_id"
belongs_to :req_user_rating, class_name: "Rating",
                             foreign_key: "req_user_rating_id"
def exchange
  Exchange.find_by("init_user_rating_id=? or req_user_rating_id=?", id, id)
end
create_table "exchanges", force: :cascade do |t|
  t.integer  "init_user_id",        null: false
  t.integer  "req_user_id",         null: false
  t.integer  "init_user_rating_id"
  t.integer  "req_user_rating_id"

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end

create_table "ratings", force: :cascade do |t|
  t.integer  "rating"
  t.text     "text",                limit: 1000

  t.datetime "created_at",          null: false
  t.datetime "updated_at",          null: false
end