Rails 3 - 按名称而不是ID查找

时间:2011-04-06 20:00:52

标签: ruby-on-rails ruby-on-rails-3

我正在尝试学习RoR,构建我的第一个应用程序,一个基本的库存应用程序。我试过四处寻找,但找不到正确的语法,所以我想我会问。

这是我的设置:

模型

class Item < ActiveRecord::Base
belongs_to :supplier

class Supplier < ActiveRecord::Base
has_many :items

项目控制器

@items = Item.find_all_by_supplier_id '1'

这将返回我想要的数据,但我希望将供应商名称输入到控制器中,这样如果ID不匹配,它仍然可以正常工作。

希望有足够的信息,谢谢!

3 个答案:

答案 0 :(得分:18)

您可以反转方法位并尝试:

@items = Supplier.find_by_name('THE NAME').items

Rails创建用于搜索的动态find_by_ *和find_all_by_ *方法。而不是通过supplier_id检索项目,我建议您让rails使用您在上面的代码段中设置的关联为您执行此操作。在内部,这仍然使用supplier_id,但rails正在处理该过程而不是您。

这也是可能的,所以如果您有一个项目并想要供应商,您可以这样做:

Item.find(1).supplier

答案 1 :(得分:0)

@items = Item.joins(:suplier).where(:suplier => { :name => "Suplier name" })

答案 2 :(得分:0)

#include <iostream>
#include <memory>

template<class Dest, class Source, class Deleter>
auto
make_proxy_deleter(std::unique_ptr<Source, Deleter>& source)
{
    return [original = source.get_deleter()](Dest* p) {
        original(dynamic_cast<Source*>(p));
    };
}

template<class Dest, class T, class Deleter>
auto
dynamic_cast_unique(std::unique_ptr<T, Deleter>&& source)
{
    auto proxy_deleter = make_proxy_deleter<Dest>(source);
    auto p = dynamic_cast<Dest*>(source.get());
    if (!p) {
        return std::unique_ptr<Dest, decltype(proxy_deleter)>(nullptr,
                                                              std::move(proxy_deleter));
        // or... throw std::invalid_argument("not convertible");
    }

    return std::unique_ptr<Dest, decltype(proxy_deleter)>(dynamic_cast<Dest*>(source.release()),
                                                          std::move(proxy_deleter));
}

struct A {
    virtual ~A() {};
};
struct B {
    virtual ~B() {};
};
struct C: A, B {};


using namespace std;

auto main() -> int
{
    auto pa = make_unique<C>();
    auto pb = dynamic_cast_unique<B>(std::move(pa));
    return 0;
}

其中Supplier.find_by_colname(params[:name]) colname的名称,我们要在其中检查参数值。在rails中,我们可以使用Supplier table column添加列名称,如上所示,rails将显示它的魔力;)。以下是Doc

中的参考