我已经读过他们但仍然不清楚我想使用哪一个以及如何使用。 我有用户模型,消息模型和放置模型
消息模型:
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还是多态? 我该怎么决定?
我很欣赏我决定具体关联的方式和原因的思考过程。
答案 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"