Ruby on rails 属于多个其他对象的对象

Ruby on rails 属于多个其他对象的对象,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,根据反馈模型得出以下关联: 反馈.rb belongs_to :buyer, :foreign_key => :buyer_id, :class_name => "User" belongs_to :seller, :foreign_key => :seller_id, :class_name => "User" belongs_to :listing 反向关联是有许多 当创建反馈对象时,它可以“锚定”到上述任何其他对象(例如买方反馈,卖方反馈,列表反馈) 假设在本例

根据反馈模型得出以下关联:

反馈.rb

belongs_to :buyer, :foreign_key => :buyer_id, :class_name => "User"
belongs_to :seller, :foreign_key => :seller_id, :class_name => "User"
belongs_to :listing
反向关联是
有许多

创建
反馈对象时,它可以“锚定”到上述任何其他对象(例如
买方反馈
卖方反馈
列表反馈


假设在本例中,我们希望主要将其与买家链接,因此
将反馈路由嵌套在用户中
,然后在反馈控制器中构建一个创建操作,该操作类似于:

current_user.feedbacks.new(feedback_params)
还是参考更合适/正确? 如果没有明确的买家模型,这是否有效?
Rails是如何合并其他
所属关系的?
它不是嵌套属性(因为其他对象已经存在)

我应该在其他参数中合并类似的内容吗?
我见过的一种方法是在验证前使用
过滤器,这种方式(从不同的领域)如下:

class Feedback < ActiveRecord::Base
  belongs_to :user
  belongs_to :host, :class_name => "User"
  belongs_to :inquiry
  belongs_to :room

before_validation :set_room_and_guest_id

def set_room_and_guest_id
  self.room ||= self.inquiry.room if self.inquiry
  self.user ||= self.inquiry.user if self.inquiry
end
类反馈“用户”
属于:查询
属于:房间
验证前:设置房间和客人id
def设置房间和客人id
self.room | self.inquiry.room如果self.inquiry
self.user | |=self.inquiry.user如果self.inquiry
结束
我今天花了很长时间阅读了有关这方面的相关文章以及Rails文档,但还没有找到结论。

这里没有“正确”的方法-只需构建您想要的系统。这听起来像是
买家对
卖家出售的
物品
反馈
,所以将所有这些东西联系在一起是完全合理的(或者至少亚马逊还没有找到不这样做的理由,这是一个非常好的迹象)

您可能正在寻找的最简单的“Rails方式”是在反馈表单中包含所有相关ID。这确实让那些想要摆弄的人能够接触到它们,例如,通过将卖家/挂牌ID设置为自己的,并留下虚假的正面反馈。您可以通过在控制器中合并
@seller
@listing
来解决这一问题,如您所述,或者通过验证审核人已购买物品,不能留下多个物品,等等

听起来这里可能还有
交易
对象的空间,表示
买方
卖方
清单
之间的链接。可能
反馈
属于
事务


总的来说,我要说的是,你已经被所有可用的选项所麻痹,最好的办法是选择一个并用它运行。当不清楚哪一个方向最好时,这通常是因为你还没有掌握你所需要的所有信息,但一旦你尝试了一些东西,你会很快学到更多。一旦你意识到“哦,我应该用另一种方法来做”,代码的美妙之处在于你可以改变它。

这里没有“正确”的方法——只需构建你想要的系统。这听起来像是
买家对
卖家出售的
物品
反馈
,所以将所有这些东西联系在一起是完全合理的(或者至少亚马逊还没有找到不这样做的理由,这是一个非常好的迹象)

您可能正在寻找的最简单的“Rails方式”是在反馈表单中包含所有相关ID。这确实让那些想要摆弄的人能够接触到它们,例如,通过将卖家/挂牌ID设置为自己的,并留下虚假的正面反馈。您可以通过在控制器中合并
@seller
@listing
来解决这一问题,如您所述,或者通过验证审核人已购买物品,不能留下多个物品,等等

听起来这里可能还有
交易
对象的空间,表示
买方
卖方
清单
之间的链接。可能
反馈
属于
事务


总的来说,我要说的是,你已经被所有可用的选项所麻痹,最好的办法是选择一个并用它运行。当不清楚哪一个方向最好时,这通常是因为你还没有掌握你所需要的所有信息,但一旦你尝试了一些东西,你会很快学到更多。一旦你意识到“哦,我应该用另一种方式来做这件事”,代码的美妙之处在于你可以改变它。

我假设每个清单都有一个买家和一个卖家,并且每个清单可以有零个或一个反馈。然后你可能会把反馈和买家和卖家联系起来,让事情变得有点混乱。规范化的方法是将反馈与列表相关联,而不是与其他内容相关联。然后所有的问题都消失了


(注意,您仍然可以通过使用
:通过
rails关系直接从反馈中获得买家(或卖家)。

我假设每个列表都有一个买家和一个卖家,并且每个列表可以有零个或一个反馈。然后你可能会把反馈和买家和卖家联系起来,让事情变得有点混乱。规范化的方法是将反馈与列表相关联,而不是与其他内容相关联。然后所有的问题都消失了

(注意,您仍然可以使用
:通过
rails关系直接从反馈中获得买家(或卖家)。

也许您正在寻找

一个稍微高级的关联扭曲是多态关联。对于多态关联,一个模型可以在单个关联上属于多个其他模型

也许你在找

一个稍微高级的关联扭曲是多态关联。对于多态关联,一个模型可以在单个关联上属于多个其他模型

我想你想要
params.require(:feedback).permit(:rating, :comment).merge(seller_id: @seller.id, listing_id: @listing.id)
class Feedback < ActiveRecord::Base
  belongs_to :user
  belongs_to :host, :class_name => "User"
  belongs_to :inquiry
  belongs_to :room

before_validation :set_room_and_guest_id

def set_room_and_guest_id
  self.room ||= self.inquiry.room if self.inquiry
  self.user ||= self.inquiry.user if self.inquiry
end