哪种关系适合使用STI或多态?

时间:2014-01-08 04:16:02

标签: ruby-on-rails ruby ruby-on-rails-4 polymorphism sti

我已经读过他们但仍然不清楚我想使用哪一个以及如何使用。 我有用户模型,消息模型和放置模型

消息模型:

class Message < ActiveRecord::Base
    belongs_to :user
end

消息表:

create_table "messages", force: true do |t|
  t.string   "title"
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

用户模型:

class User < ActiveRecord::Base
    has_many :messages
end

用户表:

create_table "users", force: true do |t|
  t.string   "email"
  t.string   "password_digest"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "username"
end

现在,我想做的是: “USER”在“PLACES”中说“MESSAGES”

例如。 “AHMED”来自“EARTH”的“HELLO”

对我来说,两个模型(消息和地点)都有相同的数据(数据类型)和相同的行为。所以place表应该是:

create_table "places", force: true do |t|
  t.string   "name"
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

现在可能是我感到困惑或者做得很多。

消息和地方应该有什么样的关系?应该是STI还是多态? 我该怎么决定?

我很欣赏我决定具体关联的方式和原因的思考过程。

1 个答案:

答案 0 :(得分:1)

此示例尽管Messages和Places具有相同的数据,但似乎不是STI / Polymorphism场景,它们应该有两个不同的表。

这可以作为解决方案:

create_table "users" do |t|
  t.string   "username"
end
create_table "messages" do |t|
  t.string   "text"
  t.integer  "user_id"
  t.integer  "place_id"
end
create_table "places" do |t|
  t.string   "name"
end

class User < ActiveRecord::Base
  has_many :messages
  has_many :places, through: :messages
end

class Place < ActiveRecord::Base
end

class Message < ActiveRecord::Base
  belongs_to :user
  belongs_to :place
  def to_s
    "#{user.username} says #{title} from #{place.name}"
  end
end

ahmed = User.new(username: "AHMED")
earth = Place.new(name: "EARTH")
message = Message.new(text: "HELLO", user: ahmed, place: earth)
puts message
# => "AHMED says HELLO from EARTH"