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