【问题标题】:Rails combine two relations to one resultRails 将两种关系组合成一个结果
【发布时间】:2014-10-02 13:24:15
【问题描述】:

我有一个 Dogs 和 Owners 表 我想要一个结果,其中生成的对象具有狗和所有者的字段,因此我可以稍后使用此对象,转换为 json 等,而无需再次查询数据库或命中缓存

所以如果我有Dog.collie,每只狗都有idbreedageowner_id,每个主人都有idname -

我想创建一个带有狗 id、品种和所有者名称的新对象

Dog.joins(:owner).collie 会返回一个狗对象列表,我想做dog.owner,它会命中缓存。如果我将其转换为 json,则缺少所有者名称

http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields 上说我可以返回具有特定字段的模型实例。

如何返回一个包含 3 个字段的对象 - 2 个狗和 1 个所有者(显然没有定义这样的对象,但让 Rails 来做)

【问题讨论】:

  • 查看此链接了解所有可能的选项blog.arkency.com/2013/12/rails4-preloading
  • 请发布更多代码示例和一些伪代码来说明您想要做什么。您的问题不清楚。
  • 我会解释一下,我知道rails可以做到这一点,我只是不知道怎么称呼它

标签: sql ruby-on-rails activerecord join


【解决方案1】:

你可以的

Dog.includes(:owner)

但如果你想要的只是名字,那么你可以委托给所有者

Class Dog < ActiveRecord::Base
  delegate :name, to: :owner, prefix: true, allow_nil: true
end

这将允许您这样做

@dog = Dog.first
@dog.owner_name => 'Bob'

【讨论】:

  • 是的,但之后我想将结果作为 json 返回,所以我需要在同一个哈希/对象中的所有内容
  • 好的,那么要么按照 bekicot 说的做,要么覆盖 to_json 方法
【解决方案2】:

怎么样。

class Dog
  belongs_to :owner
end

dogs = Dog.all

dogs.to_json(:include => :owner)

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多