Ruby on rails 一个模型上的多个多态属性

Ruby on rails 一个模型上的多个多态属性,ruby-on-rails,comments,polymorphic-associations,Ruby On Rails,Comments,Polymorphic Associations,我一直在创建一个应用程序,它有几个不同的模型类型,充当不同的页面类型。 我目前有一个Posts模型,它有两个多态属性:Postable和postabable,其中分别是发布帖子的页面和每个帖子的作者。 例如,我希望用户能够撰写和接收帖子,同时我也希望一个组能够通过管理员用户接收帖子和撰写帖子 我的帖子模式目前如下: class Post < ActiveRecord::Base before_create :set_latlong belongs_to :posterable, poly

我一直在创建一个应用程序,它有几个不同的模型类型,充当不同的页面类型。 我目前有一个Posts模型,它有两个多态属性:Postable和postabable,其中分别是发布帖子的页面和每个帖子的作者。 例如,我希望用户能够撰写和接收帖子,同时我也希望一个组能够通过管理员用户接收帖子和撰写帖子

我的帖子模式目前如下:

class Post < ActiveRecord::Base
before_create :set_latlong

belongs_to :posterable, polymorphic: true
    belongs_to :postable, polymorphic: true

default_scope -> { order('created_at DESC') }
validates :content, presence: true, length: { maximum: 140 }
validates :posterable_id, presence: true
validates :posterable_type, presence: true

def set_latlong
    self.latitude = posterable.latitude
    self.longitude = posterable.longitude
end

def self.from_users_favourited_by(user)
    favourited_user_ids = "SELECT favourite_id FROM favouriteusers
                                WHERE favourited_id = :user_id"
    where("posterable_id IN (#{favourited_user_ids}) OR posterable_id = :user_id", user_id: user.id)
end
class PostssController < ApplicationController
结束

我相信这些都是可行的,也允许各种模型发布在各种模型页面上。但是,我还不太确定如何实现这一点,Post controller如下所示:

class Post < ActiveRecord::Base
before_create :set_latlong

belongs_to :posterable, polymorphic: true
    belongs_to :postable, polymorphic: true

default_scope -> { order('created_at DESC') }
validates :content, presence: true, length: { maximum: 140 }
validates :posterable_id, presence: true
validates :posterable_type, presence: true

def set_latlong
    self.latitude = posterable.latitude
    self.longitude = posterable.longitude
end

def self.from_users_favourited_by(user)
    favourited_user_ids = "SELECT favourite_id FROM favouriteusers
                                WHERE favourited_id = :user_id"
    where("posterable_id IN (#{favourited_user_ids}) OR posterable_id = :user_id", user_id: user.id)
end
class PostssController < ApplicationController
结束


我相信这项工作的关键是在load_postable和find_postable方法中分离资源,这是我从Railscast关于多态关联的教程中获得的,但我真的不知道如何在同一个模型中区分这些方法?

好的,所以你需要一个配置文件模型,将使用哪个用户/管理员在站点上执行操作

您应该为用户自动创建并选择默认组,然后为每个组单独创建一个组,其中一个组成为管理员

配置文件本身不应该真正包含任何属性,只要将它们委托给关联,如果您希望将其委托给用户或其他模型,可能是多态的

这样,您就有了一个非常干净的界面,Profile类将成为模型的装饰器

在控制器级别上,您应该有一个类似于Desive中当前用户的当前配置文件方法,该方法将存储/检索会话中的配置文件id


请参阅:

您做错了。错了,我不知道从哪里开始。为什么评论作者是多态的?Admin是用户的一个子类型。你把东西复杂化了,在模型中寻找更简单的公共元素,并更好地抽象它们。对于user/admin,您可能希望查看STI,但是一个简单的属性就足够了。@MichaelSzyndel admins用于特定实例,而不是用户子类,并且添加了admin属性,即当用户创建组时,他们自动成为该组的管理员。然后,他们可以做的是在用户或组的墙上张贴他们自己或他们所管理的任何组。WTF是这样吗?资源,id=request.path.split'/'[1,2]。阅读有关Rails路由的文章,从未见过有人做过类似的事情,这是有充分理由的。@MichaelSzyndel我相信我是从中得到的,对不起,我对Rails只是一个新手,刚刚起步!天哪,Rails里有这样的东西吗?真不敢相信我的眼睛。无论如何抛开铁轨,看看guides.rubyonrails.com。也可以先尝试一些更简单的方法,比如单一多态关联,最终您将更快地学习和理解。说到实施,我仍然建议采纳我的答案。这是装饰设计模式,这是一个非常好的方法。我已经添加了我的代码,希望这能让你更好地理解我的要求。