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

标签 ruby-on-rails rails-activerecord

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

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

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

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

运行 Rails 3.0.7

最佳答案

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

域类

class Domain < ActiveRecord::Base
  has_many :links
end

链接类

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.exists?(:href => '...')

关于ruby-on-rails - Rails - 这是不好的做法还是可以优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5787556/

相关文章:

ruby-on-rails - 创建空输入字段的简单形式关联

mysql - Ruby on Rails 中的读取锁定

ruby-on-rails - Rails 日志中的缩进

javascript - rails 上的 ruby : leaflet-rails not loading

ruby-on-rails - 使用RVM Gemsets,Bundler和RubyMine

ruby-on-rails - 有没有办法在 Rail 的命名路由中指定默认子域?

ruby-on-rails - Rails has_one 关联,访问关联模型

ruby-on-rails - rails : How can I set default values in ActiveRecord?

ruby-on-rails - 如何在 Rails 中的 LOWER ("users"."username"上创建索引(使用 postgres)

ruby-on-rails - 如何使用 arel 调用 postgres 函数?