【问题标题】:Re-using methods for muliple models多个模型的重用方法
【发布时间】:2013-04-29 21:23:26
【问题描述】:

您将如何实现基于请求模型搜索表​​的方法?

我有一个 User 和 Vehicle 表,它们都是存储在 Equipment 表中的分配设备。 我正在尝试使用相同的方法显示分配给用户和车辆的设备。 Equipment 表有一个 user_id 和 vehicle_id 显示设备分配到哪里。

有什么方法可以传入一个表变量(可以是用户或车辆),然后将该变量 ID:作为搜索条件,以便显示分配给用户或车辆的设备,具体取决于哪个显示页面正在查看-

def equip(table, id)
  equip = Equipment.where(table_id: id)
end

这样传入的 table 变量替换了 where() 方法的“table”部分,使其成为 user_id 或 vehicle_id?

【问题讨论】:

    标签: ruby-on-rails shared-libraries


    【解决方案1】:

    正如 Yoshiji 先生所说,这是可能的,但我强烈建议您查看 polymorphic associations

    【讨论】:

    • 不知道为什么我一开始就没有想到这一点。我是否正确理解,然后我可以使用 @vehicle.equipments/@user.equipments 来显示分配的所有内容?
    • @SamThode 是的,这里也有一个关于它的 railscast,可能会更清楚地解释它railscasts.com/episodes/154-polymorphic-association-revised 注意这是一个修改后的剧集,所以你需要订阅。还有一个较旧的,通常也是免费的。
    • 我实际上只是在浏览旧的。不过,在那张纸条上......我想知道我是否应该在之前问过这个......使用多态我可以将相同的设备分配给用户和车辆吗?
    • 当然,您唯一需要注意的是您需要将此equipment 分配给两者。一个更合乎逻辑的方法是将has_many :through 与多态关联结合起来。这当然会更加令人困惑,但是如果您希望例如用户 1 拥有设备 1,车辆 1 拥有设备 1,同时仍然保持多态关联提供的便利性,这将是要走的路线。这是一个相当普遍的例子:stackoverflow.com/questions/4641500/…
    【解决方案2】:

    是的,有可能:

    def equip(table, id)
      equip = Equipment.where("#{table}_id = ?", id)
    end
    

    但这可能很快导致错误,请在之前添加一些检查内容:

    def equip(table, id)
      if self.columns.map(&:name).include?("#{table}_id")
        equip = Equipment.where("#{table}_id = ?", id)
      else
        # the columns does not exists!
      end
    end
    

    解释:

    self.columns.map(&:name) # returns the name of all the columns of the model in a array
    

    我的 Rails 控制台示例:

    User.columns.map(&:name)
    => ["id", "username", "profession_id", "external_reference", "authorisation_group", "created_at", "updated_at", "active", "license", "visible"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多