小编pja*_*jam的帖子

在包含在类中的Module中使用define_method?

我有这样的事情:

module MyModule
    define_method(:foo){ puts "yeah!" }
end

class User
  include MyModule
end
Run Code Online (Sandbox Code Playgroud)

但这不符合预期......它们没有定义.此外,我需要使用模块,因为我想区分方法和普通的用户方法.我喜欢这个:

MyModule.instance_methods
Run Code Online (Sandbox Code Playgroud)

请帮忙..我错过了什么?我也尝试过:

module MyModule
  (class << self; self; end).class_eval do
    define_method(:foo){ puts "yeah!" }
  end
end
Run Code Online (Sandbox Code Playgroud)

这也行不通:/

澄清...我想用:

User.first.foo
Run Code Online (Sandbox Code Playgroud)

MyModule.foo
Run Code Online (Sandbox Code Playgroud)

ruby module metaprogramming ruby-on-rails

7
推荐指数
2
解决办法
2514
查看次数

如何在不预加载的情况下加载关联?

我有以下两个模型:

schema "users" do
    field :email, :string
    field :crypted_password, :string
    field :password, :string, virtual: true

    has_many :exercise_entries, ExerciseEntry

    timestamps
end
Run Code Online (Sandbox Code Playgroud)

和:

schema "exercise_entries" do
  field :date, Ecto.DateTime
  field :exercise, :string
  field :category, :string
  field :weight, :float
  field :reps, :integer
  belongs_to :user, User

  timestamps
end
Run Code Online (Sandbox Code Playgroud)

我在 iex 中运行了以下代码:

u = Repo.get(User, 1)
iex(8)> u.exercise_entries
#Ecto.Association.NotLoaded<association :exercise_entries is not loaded>
Run Code Online (Sandbox Code Playgroud)

我知道我可以做Repo.get(User,1) |> Repo.preload([:exercise_entries]),然后我可以访问锻炼条目。是否有可能以某种方式加载运动条目而不先预加载它们?

elixir ecto

6
推荐指数
1
解决办法
1232
查看次数

使用Carrierwave与模型之间的一对多关系

阶段

图像库应用程序.我有两个型号HandcraftPhotos. 一个手工艺品可能有很多照片,假设我有这样的模型:

  • Handcraft(name:string)
  • Photo(filename:string, description:string, ...)

_form.html.erb手工艺品中,有:

<%= form_for @handcraft, html: {multipart: true} do |f| %>
  # ... other model fields

  <div class="field">
    <%= f.label :photo %><br />
    <%= f.file_field :photo %>
  </div>

  # ... submit button
<% end %>
Run Code Online (Sandbox Code Playgroud)

handcraft.rb 看起来像这样:

class Handcraft < ActiveRecord::Base
  attr_accessible :photo
  has_many :photos
  mount_uploader :photo, PhotoUploader
  # ... 
end
Run Code Online (Sandbox Code Playgroud)

photo_uploader.rb:

class PhotoUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails has-many carrierwave ruby-on-rails-3.2

5
推荐指数
1
解决办法
3370
查看次数

为什么不能在可变字符串引用上调用可变方法但适用于 TcpStream

当我试图理解可变变量(恰好是引用)let mut x: &i32与可变引用(例如)之间的差异时let x: &mut i32,我发现了我无法理解的差异:

这有效,其中by_ref有签名fn by_ref(&mut self) -> &mut Self:(文档

fn example(mut t: &TcpStream) {
    t.by_ref();
}
Run Code Online (Sandbox Code Playgroud)

但下面的String,使用具有类似签名的方法reserve

pub fn reserve(&mut self, additional: usize)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,错误是:

“不能借用*str可变的,因为它位于&引用后面”

pub fn reserve(&mut self, additional: usize)
Run Code Online (Sandbox Code Playgroud)

有趣的是,这两个具有可变引用的示例有效,并且据我所知,是使用可变方法的推荐方法:

fn example(mut str: &String) {
    str.reserve(10);
}
Run Code Online (Sandbox Code Playgroud)

TcpStream那么 a和 a之间有什么不同String,允许&mut self在一种情况下调用带有参数的方法,而在另一种情况下则不允许呢?

rust

4
推荐指数
1
解决办法
96
查看次数

怎么做sql循环

works(emNo, comNo, salary).

". Suppose it gives me a column with 5 rows. How do I count "对于每一行,我可以使用"从作品emNo`中选择不同的comNo"获得不同的comNo 吗?

mysql sql

3
推荐指数
1
解决办法
75
查看次数

Erlang/Elixir守卫和arity

有没有办法看到函数的守卫而没有看到源代码?

给出一个示例函数(在Elixir中):

def divide(x, y) when y != 0 do
  x / y
end
Run Code Online (Sandbox Code Playgroud)

怎么会弄清楚在没有访问源代码的情况下有一个分区/ 2的守卫,以及如何找到关于该守卫的信息或者后卫对模式匹配的预期?

我正在观看来自Ruby Conf 2014的Chris McCord(Elixir凤凰框架的创建者)的演讲.在演讲中,克里斯正在描述警卫,并且有人问是否有办法检查可以显示该功能的警卫的功能.

这是谈话的问题:

https://www.youtube.com/watch?v=5kYmOyJjGDM&t=5188

视频t =时间后不久就会问这个问题.

erlang elixir arity pattern-guards

2
推荐指数
1
解决办法
396
查看次数

Rails属性头痛

新手铁路问题即将来临.

我有一个这样的课:

class Thing < ActiveRecord::Base
    attr_accessible :name
    attr_accessor :name
    validates_uniqueness_of :name, :case_sensitive => false
end
Run Code Online (Sandbox Code Playgroud)

我已完成迁移,表格看起来还不错.然后我启动rails console并尝试以下操作:

t = Thing.new(:name => "test")
=> #<Thing id: nil, name: nil, description: nil, created_at: nil, updated_at: nil> 
Run Code Online (Sandbox Code Playgroud)

已经在这里它说名字是零,为什么?继续,我试试这个:

t.name
 => "test"
Run Code Online (Sandbox Code Playgroud)

现在名字似乎设定了吗?如果我试图保存:

t.save!
Thing Exists (8.0ms)  SELECT 1 AS one FROM "things" WHERE LOWER("things"."name") = LOWER('test') LIMIT 1
SQL (16.0ms)  INSERT INTO "things" ("created_at", "description", "name", "updated_at") VALUES ('2012-10-28 16:10:12.701000', NULL, NULL, '2012-10-28 16:10:12.701000')
=> true 
Run Code Online (Sandbox Code Playgroud)

为什么我指定的名称没有保存?我想要的是能够在调用new时将属性指定为哈希,然后保存实例.

activerecord ruby-on-rails ruby-on-rails-3

1
推荐指数
1
解决办法
415
查看次数