小编Eri*_*rik的帖子

使用Elasticsearch/Tire展平多态AR关系

我正在使用Rails 3应用程序,以允许人们申请资助等.我们使用Elasticsearch/Tire作为搜索引擎.

文件,例如赠款提案,由许多不同类型的答案组成,如联系信息或论文.在AR中,(通常是关系式dbs)你不能直接指定多态"has_many"关系,所以相反:

class Document < ActiveRecord::Base
  has_many :answerings
end

class Answering < ActiveRecord::Base
  belongs_to :document
  belongs_to :question
  belongs_to :payload, :polymorphic => true
end
Run Code Online (Sandbox Code Playgroud)

"有效负载"是个人答案类型的模型:联系人,叙述,多项选择等.(这些模型在"Answerable"下命名为.)

class Answerable::Narrative < ActiveRecord::Base
  has_one :answering, :as => :payload
  validates_presence_of :narrative_content
end

class Answerable::Contact < ActiveRecord::Base
  has_one :answering, :as => :payload
  validates_presence_of :fname, :lname, :city, :state, :zip...
end
Run Code Online (Sandbox Code Playgroud)

从概念上讲,这个想法是一个答案,它由一个回答(函数,如连接表,存储所有答案共有的元数据)和一个回答(存储答案的实际内容)组成.这非常适合编写数据.搜索和检索,而不是.

我想使用Tire/ES来展示我的数据更理智的表示,以便进行搜索和阅读.在正常的轮胎设置中,我最终会得到(a)答案索引和(b)叙述,联系人,多种选择等的单独索引.相反,我想存储文档和答案,可能作为父/子.Answers索引将合并来自Answerings(id,question_id,updated_at ...)和Answerables(fname,lname,email ...)的数据.通过这种方式,我可以从单个索引中搜索Answers,按类型,question_id,document_id等进行过滤.更新将从Answering触发,但每次应答都会从其应答中提取信息.我正在使用RABL模拟我的搜索引擎输入,所以这很容易.

Answering.find(123).to_indexed_json  # let's say it's a narrative
=> { id: 123, question_id: 10, :document_id: 24, updated_at: ..., updated_by: root@me.com, narrative_content: "Back …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails elasticsearch tire

5
推荐指数
1
解决办法
727
查看次数

ruby:使用块作为正常(内联)表达式?

寻找其他Rubyists的小智慧.有一段时间了,我在一些应用程序中使用了以下方便,我想知道是否有一种我缺少的语言功能:

class Object
  def as_block
    yield
  end
end
Run Code Online (Sandbox Code Playgroud)

还有其他用途,但我的正常情况是条件赋值需要一些非平凡的逻辑.两种明显的方法:

# via a second method:
def foo
  @foo ||= set_foo
end

# via conditional logic:
def foo
  if @foo
    @foo
  else
    # do complicated stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

这两种方法看起来都很丑陋:在第一种情况下,#set_foo似乎无关紧要,而第二种看起来有点令人讨厌.所以,相反,我喜欢这个:

def foo
  @foo ||= as_block do
    # do complicated stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

这里的问题(除了猴子修补对象)是它真的是一个依赖(在猴子补丁上)看起来像一个语言功能.也就是说,像这样的东西真的不应该在(比方说)Rails初始化器中 - 它似乎应该在一个gem中,所以可以正确地管理依赖.然后我打包整个宝石来运行五行代码来修补对象...

所以,我的问题:1.其他人使用这个,或类似的东西?2.默认情况下Ruby团队是否考虑过包含这样的内容?使用块作为简单的旧表达似乎是一种非常简单的方法,但它并不存在(据我所知),这让我想知道是否有某种原因不包括它,或者...... 3.是否已经有一些更好的这样做的方式,我只是不知道?

谢谢!

-E

ruby

1
推荐指数
1
解决办法
67
查看次数

标签 统计

elasticsearch ×1

ruby ×1

ruby-on-rails ×1

tire ×1