Ruby 有没有办法检查一个记录是否由活动记录中的另一个模型生成?

Ruby 有没有办法检查一个记录是否由活动记录中的另一个模型生成?,ruby,activerecord,ruby-on-rails-3,Ruby,Activerecord,Ruby On Rails 3,当使用accepts_nested_attributes_for时,我在进行要求原始文件存在的验证时遇到了问题。代码将有助于澄清这句话 class Foo < ActiveRecord::Base has_one :bar accepts_nested_attributes :bar end class Bar < ActiveRecord::Base #property name: string belongs_to :foo validates_presen

当使用accepts_nested_attributes_for时,我在进行要求原始文件存在的验证时遇到了问题。代码将有助于澄清这句话

class Foo < ActiveRecord::Base
  has_one :bar
  accepts_nested_attributes :bar
end

class Bar < ActiveRecord::Base
  #property name: string
  belongs_to :foo
  validates_presence_of :foo #trouble line!
end

#now when you do
foo = Foo.create! :bar_attributes => {:name => 'steve'}
#you get an error because the bar validation failed
然后我必须确保所有html访问都使用了project\u bids\u path或form\u for[:project,@bid]等。下一部分基本上未经测试,但到目前为止,所需的行为已经存在。我是从耶胡达关于一般动作的帖子中得到这个想法的


然而,在做了所有这些之后,我绝对不认为这值得。我认为嵌套的_属性会破坏某些东西,如果验证不起作用,则可以进行改进,但在查看代码一段时间后,我不确定如何修复它,或者它是否值得使用。

首先,当使用嵌套的_属性时,您将看到容器的存在。在本例中:当您保存Foo并且还有一个用于Bar的嵌套表单时,Bar由Foo构建

我认为,如果您确定只在使用Foo的上下文中使用Bar,那么就没有必要进行这种验证

顺便说一句,尝试按如下方式编写验证(Rails3的新首选语法):

希望这有帮助,
a、

感谢您提供的格式化提示!我遇到的问题来自于试图制作一个漂亮的界面。项目中还有一个JSon API部分。事实上,酒吧是一个投标,而foo是一个项目。从web UI创建项目时,可以使用嵌套的_属性设置出价。项目完成后,您可以在使用嵌套属性的“项目”页面上编辑出价。在json方面,我希望有人能够通过使用项目id发布到bids控制器来创建投标。为此,我需要验证项目id是否存在,不幸的是,目前项目id位于控制器中。您可以在不使用json请求的情况下,通过使用一点JS来进行很好的变通。例如,您为bid创建一个嵌套表单,然后使用JS创建一个链接/按钮来添加新的bid表单(您可以通过单击添加任意数量的bid)。当您编辑/保存项目时,您将正确保存投标。如果您对这个解决方案感兴趣,我可以给您一些示例代码;-)那是个好主意!我仍然认为您应该能够设置验证!!!>。<然而,我一直在思考的例子越来越做作。我想我可以为项目的另一部分设置javascript,但是我很感谢你的提议。特别是对于这个投标问题,我实际上需要将其作为一个嵌套资源,因为没有项目就不可能有投标。谢谢你的帮助!
class Bar < ActiveRecord::Base
  validates_presence_of :foo, :unless => :being_built_by_foo?
end
resources :bids
resources :projects do
  resources: bids
end
#I'm sure there is a better way then map.connect
map.connect "projects/invalid_id", :controller => "projects", :action => "invalid_id"
resources :projects
  resources :bids
end

#couple of changes from Yehuda
def redirect(*args, &block)
  options = args.last.is_a?(Hash) ? args.pop : {}

  path = args.shift || block
  path_proc = path.is_a?(Proc) ? path : proc {|params| path % params }
  status = options[:status] || 301

  lambda do |env|
    req = Rack::Request.new(env)
    #Get both the query paramaters and url paramaters
    params = env["action_dispatch.request.path_parameters"].merge req.params
    url = path_proc.call(params.stringify_keys)
    #Doesn't add the port back in!
    #url = req.scheme + '://' + req.host + params
    #content-type might be a bad idea, need to look into what happens for different requests
    [status, {'Location' => url, 'Content-Type' => env['HTTP_ACCEPT'].split(',').first}, ['Moved Permanently']]
  end
end

def bid_path
  redirect do |params| 
    if params['project_id']
      "/projects/#{params['project_id']}/bids/#{params['id']}" 
    else
      '/projects/invalid_id'
    end
  end
end


match "bids", :to => bid_path
match "bids/:id", :to => bid_path
validates :foo, :presence => true