Rails - 这是不好的做法还是可以优化?

发布于 2024-11-03 02:48:52 字数 318 浏览 2 评论 0原文

这会被视为不好的做法吗?

unless Link.exists?(:href => 'example.com/somepage')
  Domain.where(:domain => 'example.com').first.links.create(:href => 'example.com/somepage', :text => 'Some Page')
end

我意识到我可能会请求比实际需要更多的数据,我可以以某种方式优化它吗?

域是一个唯一索引,因此查找应该相当快。

运行轨道3.0.7

Would this be considered bad practice?

unless Link.exists?(:href => 'example.com/somepage')
  Domain.where(:domain => 'example.com').first.links.create(:href => 'example.com/somepage', :text => 'Some Page')
end

I realize I might be requesting more data then I actually need, can I optimize this somehow?

Domain is a unique index so the lookup should be fairly quick.

Running Rails 3.0.7

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

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

发布评论

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

评论(2

鸠魁 2024-11-10 02:48:52

您可以通过以下方式重构您的代码:

Domain class

class Domain < ActiveRecord::Base
  has_many :links
end

Link class

class Link < ActiveRecord::Base
  belongs_to :domain

  validates :href,
            :uniqueness => true

  attr :domain_url

  def domain_url=(main_domain_url)
    self.domain = Domain.where(domain: main_domain_url).first ||
                  Domain.new(domain: main_domain_url)
  end

  def domain_url
    self.domain.nil? ? '' : self.domain.domain_url
  end
end

使用

Link.create(href: 'example.com/somepage',
            text: 'Some Page',
            domain_url: 'example.com')

结论

在这两种情况(您的和我的)中,您都会收到两个请求(如下所示):

Domain Load (1.0ms)  SELECT "domains".* FROM "domains" WHERE "domains"."domain" = 'example.com' LIMIT 1
  AREL (0.1ms)  INSERT INTO "links" ("href", "text", "domain_id", "created_at", "updated_at") VALUES ('example.com/somepage', 'Some Page', 5, '2011-04-26 08:51:20.373523', '2011-04-26 08:51:20.373523')

但是使用此代码,您还可以免受未知域的影响,因此 Link会自动创建一个。

您还可以使用验证唯一性,以便删除所有除非 Link.exists?(:href => '...')

You can refactor your code in this manner:

Domain class

class Domain < ActiveRecord::Base
  has_many :links
end

Link class

class Link < ActiveRecord::Base
  belongs_to :domain

  validates :href,
            :uniqueness => true

  attr :domain_url

  def domain_url=(main_domain_url)
    self.domain = Domain.where(domain: main_domain_url).first ||
                  Domain.new(domain: main_domain_url)
  end

  def domain_url
    self.domain.nil? ? '' : self.domain.domain_url
  end
end

Usage

Link.create(href: 'example.com/somepage',
            text: 'Some Page',
            domain_url: 'example.com')

Conclusion

In both cases (your and mine) you get two request (like so):

Domain Load (1.0ms)  SELECT "domains".* FROM "domains" WHERE "domains"."domain" = 'example.com' LIMIT 1
  AREL (0.1ms)  INSERT INTO "links" ("href", "text", "domain_id", "created_at", "updated_at") VALUES ('example.com/somepage', 'Some Page', 5, '2011-04-26 08:51:20.373523', '2011-04-26 08:51:20.373523')

But with this code you're also protected from unknown domains, so Link'd create one automatically.

Also you can use validates uniqueness so you can remove all unless Link.exists?(:href => '...').

草莓酥 2024-11-10 02:48:52
Domain.where(:domain => 'example.com').
  first.links.
  find_or_create_by_href_and_text(:href => 'example.com/somepage', :text => "Some Page")

UPD

@domain = Domain.where(:domain => 'example.com').
            first.links.
            find_or_create_by_href('example.com/somepage')
@domain.text = "My Text"
@domain.save

或者您可以使用扩展的 update_or_create_by_* 方法:

Domain.update_or_create_by_href('example.com/somepage') do |domain|
  domain.text = "My Text"
end

更多信息如下:

Rails 3 中的 find_or_create_by 和更新创建记录

Domain.where(:domain => 'example.com').
  first.links.
  find_or_create_by_href_and_text(:href => 'example.com/somepage', :text => "Some Page")

UPD

@domain = Domain.where(:domain => 'example.com').
            first.links.
            find_or_create_by_href('example.com/somepage')
@domain.text = "My Text"
@domain.save

Or you can use extended update_or_create_by_* method:

Domain.update_or_create_by_href('example.com/somepage') do |domain|
  domain.text = "My Text"
end

More info here:

find_or_create_by in Rails 3 and updating for creating records

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