我如何将其转换为 MetaWhere 或 Arel?

发布于 2024-11-02 16:41:09 字数 584 浏览 5 评论 0原文

考虑一个城市模型具有:

  def self.search(field, search)
    if search
      where("#{field} LIKE ?", "%#{search}%")
    else
      scoped
    end
  end

在知道该字段是字符串的情况下如何使用 Arel 或 Metawhere 可以具有类似:

“名称”的 内容 “居民姓名” “state.name”

我想做类似的事情(行不通):

  def self.search(field, search)
    if search
       where(field =~ "%#{search}%")
    else
      scoped
    end
  end

那么,你的想法是什么?

真正的问题是,我怎样才能将其转换为:

“residents.name LIKE '#{value}%'”

到:

:residents => { :name =~ "#{value}%" }

Consider a City Model having:

  def self.search(field, search)
    if search
      where("#{field} LIKE ?", "%#{search}%")
    else
      scoped
    end
  end

How can I use Arel or Metawhere in that situation knowing that field is a String can have anything like:

"name"
"residents.name"
"state.name"

I want to do something like that (will not work):

  def self.search(field, search)
    if search
       where(field =~ "%#{search}%")
    else
      scoped
    end
  end

So, what are your thoughts?

The real question is, how can I convert that:

"residents.name LIKE '#{value}%'"

To that:

:residents => { :name =~ "#{value}%" }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雄赳赳气昂昂 2024-11-09 16:41:09

你应该能够像这样使用 Arel。

def self.search(field, search)
  if search
    if field =~ /\./ # table and field
      table, field = field.split('.')
      arel_join = table.singularize.camelize.constantize.arel_table
      joins(table.to_sym).where(arel_join[field].matches("%#{search}%"))
    else
      where(Resource.arel_table[field].matches("%#{search}%"))
    end
  else
    scoped
  end
end

有一个 Railscast 很好地解释了以下基础知识在 Rails 3 中使用 Arel。

You should be able to use Arel like this.

def self.search(field, search)
  if search
    if field =~ /\./ # table and field
      table, field = field.split('.')
      arel_join = table.singularize.camelize.constantize.arel_table
      joins(table.to_sym).where(arel_join[field].matches("%#{search}%"))
    else
      where(Resource.arel_table[field].matches("%#{search}%"))
    end
  else
    scoped
  end
end

There's a Railscast that does a good job of explaining the basics of using Arel in Rails 3.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文